이 글에서는 Node.js에서 오류 유형을 사용자 정의하는 방법을 자세히 소개합니다. Node.js를 배우거나 사용하는 모든 사람이 참고할 수 있는 내용이 있습니다. .보세요.
머리말
일반적으로 애플리케이션에서 생성된 오류를 처리하는 방법에 대한 전략을 고려하는 사람은 거의 없습니다. 디버깅 프로세스 중에 간단히 console.log('error')
를 사용하여 오류를 찾는 것만으로도 충분합니다. 이 디버깅 정보를 남겨두면 향후 디버깅 프로세스가 단축되고 유지 관리가 향상됩니다. 따라서 오류 메시지는 매우 중요합니다. 동시에, 그것은 또한 일부 나쁜 사용법을 가져올 것입니다. 최근 프로젝트에서는 사용자 정의 오류 유형이 사용되었으며 이에 대해 더 자세히 알아볼 필요가 있다고 느꼈기 때문에 저 자신과 필요한 다른 모든 사람이 필요할 때 더 쉽게 참조할 수 있도록 이 글을 썼습니다. console.log(‘error')
定位错误,基本够用了,通过留下这些调试信息,能够为我们以后的调试过程中升了不少时间,提高了维护性。所以错误提示非常重要。同时,也会带来一些比较糟糕用法。最近的项目里就用到了自定义错误类型,觉得有必要深入了解一下,所以就写了这篇文章,方便自己和有需要的大家在需要的时候查阅。
Subclassing Error
首先我们可以定义一个 Error 的子类。通过 Object.create
和 util.inherits
很容易实现:
var assert = require('assert'); var util = require('util'); function NotFound(msg){ Error.call(this); this.message = msg; } util.inherits(NotFound, Error); var error = new NotFound('not found'); assert(error.message); assert(error instanceof NotFound); assert(error instanceof Error); assert.equal(error instanceof RangeError, false);
可以通过 instanceof
来检查错误类型,根据类型进行不同的处理。
上面的代码设置了自带的message
, 并且 error
是 NotFound
和 Error
的一个实例, 但是不是 RangeError
。
如果用了 express
框架, 就能设置其他的 properties
让 error
变得更有用。
比方说当处理一个HTTP的错误时, 就可以写成这样:
function NotFound(msg) { Error.call(this); this.message = msg; this.statusCode = 404; }
现在就已经可以通过错误处理的中间件来处理错误信息:
app.use(function(err, req, res, next) { console.error(err.stack); if (!err.statusCode || err.statusCode === 500) { emails.error({ err: err, req: req }); } res.send(err.statusCode || 500, err.message); });
这会发送HTTP的状态码给浏览器, 当 err
的 statusCode
未设置或者等于 500 的时候, 就通过邮件来发送这个错误。这样就能排除那些 404, 401, 403等等的错误。
读取 console.error(err.stack)
事实上并不会像预期那样工作,像 node, chrome 基于 V8 的可以使用 Error.captureStackTrace(this, arguments.callee)
먼저 Error의 하위 클래스를 정의할 수 있습니다. Object.create
및 util.inherits
를 통해 쉽게 달성할 수 있습니다.
var NotFound = function(msg) { Error.call(this); Error.captureStackTrace(this, arguments.callee); this.message = msg || 'Not Found'; this.statusCode = 404; this.name = "notFound" } util.inherits(NotFound, Error); export.NotFoundError = NotFound;
#🎜 🎜 #instanceof
를 통해 오류 유형을 확인하고 유형에 따라 다른 처리를 수행할 수 있습니다.
위 코드는 내장된 메시지
를 설정하고 error
는 NotFound
및 Error
입니다. code> code>의 인스턴스이지만 RangeError
는 아닙니다.
express
프레임워크를 사용하는 경우 다른 속성
을 설정하여 error
를 더 유용하게 만들 수 있습니다.
예를 들어 HTTP 오류를 처리할 때 다음과 같이 작성할 수 있습니다.
var notFountError = require('./error').NotFountError; var UserNotFound = function(msg){ this.constructor.super_(msg); } util.inherits(UserNotFound, notFoundError);# 🎜 🎜#
err
의 statusCode
가 500으로 설정되지 않은 경우 이 오류는 이메일을 통해 전송됩니다. 이렇게 하면 404, 401, 403 등의 오류가 제거됩니다. Reading console.error(err.stack)
는 실제로 예상대로 작동하지 않습니다. 노드와 마찬가지로 V8 기반 크롬에서는 Error.captureStackTrace(이것은 인수)를 사용할 수 있습니다. .callee)
의 스택 추적에 대한 오류 생성자입니다. rrreee
#🎜🎜##🎜🎜##🎜🎜#물론 위에서 생성한 추상 오류 유형을 다른 사용자 정의 오류로 확장할 수도 있습니다. # 🎜🎜# #🎜🎜##🎜🎜##🎜🎜#rrreee#🎜🎜##🎜🎜##🎜🎜#위 내용은 모두의 학습에 도움이 되기를 바랍니다. 관련 콘텐츠. PHP 중국어 웹사이트! #🎜🎜##🎜🎜#관련 권장 사항: #🎜🎜##🎜🎜##🎜🎜#nodejs의 모듈 정의 소개#🎜🎜##🎜🎜##🎜🎜##🎜🎜##🎜🎜#nodejs 페이지의 bigpipe 비동기 로딩을 구현하는 방법#🎜🎜##🎜🎜##🎜🎜##🎜🎜##🎜🎜#fs 모듈을 기반으로 시스템 파일과 디렉터리를 읽고 쓰는 node.js 방법에 대하여#🎜🎜# # 🎜🎜##🎜🎜##🎜🎜##🎜🎜##🎜🎜##🎜🎜##🎜🎜##🎜🎜#위 내용은 Node.js에서 사용자 정의 오류 유형 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!