2012-08-28 1 views
0

내 응용 프로그램에서 오류를 처리하는 방법을 찾으려고합니다. 나는 길을 고안했다 (아래 참조). 그러나 나는 원래의 잘못을 잃어 버려서 고생한다.원래 오류를 보존하는 노드에서 다음 (새 오류())을 실행합니다.

// Defining the BadError error type, thrown by the application itself 
// 
function BadError503(message){ 
    this.httpError = 503; 
    this.message = message || "Internal error"; 
    this.name = this.constructor.name; 
} 
util.inherits(BadError503, Error); 
exports.errors.BadError503 = BadError503; 

// Defining the Error error type, thrown by the application itself 
// 
function ForbiddenError403(message){ 
    this.httpError = 403; 
    this.message = message || "User not logged in"; 
    this.name = this.constructor.name; 
} 
util.inherits(ForbiddenError403, Error); 
exports.errors.ForbiddenError403 = ForbiddenError403; 

응용 프로그램은 다음과 같이 간다 오류 처리기를 정의

exports.tokenApi = function(req, res, next, token){ 

    Workspace = mongoose.model('Workspace'); 
    User = mongoose.model('User'); 

    req.application = {}; 
    // Find the token 
    Workspace.findOne({ 'access.token': token } , function(err, doc){ 
    if(err){ 
     next(new g.errors.BadError503('Database error resolving workspace Id')); 
    } else { 
     if(! doc){ 
     next(new g.errors.ForbiddenError403('Access denied')); 
     } else { 

     // The token is there and it's valid. 
     // Set req.application.workspaceId, req.application.login and 
     // req.application.workspace (which contains all of the settings!) 
     req.application.workspaceId = doc._id; 
     req.application.workspace = doc; 
     req.application.login = doc.access.filter(function(entry){ return entry.token == token; })[0].login; 
     next(); 
     } 
    } 

다른 파일에 오류가 정의 내 코드에서

나는 이런 식으로 뭔가를 (이것은 미들웨어)이 있습니다

exports.AppErrorHandler = function(err, req, res, next){ 

    var user = null; 
    var workspace = null; 

    switch(err.name){ 
    case 'BadError503': 
    case 'ForbiddenError403': 
     Logger(null, null, 4, 'The application threw an error: ' + err.name + ', message: ' + err.message, req ); 
     res.json({ message: err.message }, err.httpError); 
    break; 

이 코드의 문제는 원래의 오류가 손실된다는 것입니다. 나는 "올바른 일을하는"커스텀 에러 핸들러를 가지고있다. (위의 코드를 참조하라 : Ajax를 통해 에러를 반환한다.) 그러나 실제 문제의 이유를 어떻게 든 유지한다면 나는 그것을 원할 것이다.

이것은 다른 질문입니다.이 나쁜 습관이 있습니까? 방법으로, 나는 내 자신의 오류를 던져서 그것을 100 % 처리 할 수 ​​있다는 사실을 좋아한다. (내가 직접 Error 객체를 만들었다.) 그러나 원래의 오류를 잃는 것은 나에게 나쁜 생각처럼 보입니다.

은 내가 만든 사용자 지정 오류의 개체에 원래 오류를 전달할 수 있습니다. 하지만 여전히 ...

어떤 생각? 또는 내가 알고 있어야하는 표준 패턴은 무엇입니까? 이 문서 밖으로

+0

[도메인 방법] (http://nodejs.org/docs/latest/api/domain.html#domain_additions_to_error_objects)과 비슷한 오류에 매개 변수를 추가 할 수 있습니다. 예 : 'err.name = 'BadError503'; 다음 (오류); –

+0

좋은 지적. 그래서 나는 효과적으로'err'에 여분의 정보를 추가 한 후에 내가 만든 커스텀 에러 객체 (실제로는 어쨌든 그들을 좋아하지 않는다)와'next (err)'를 효과적으로 제거 할 수 있을까요? 나는 그 계획을 정말로 좋아한다. 내가 고안 한 것보다 더 좋은 방법이 될 것 같니? – Merc

답변

1

점검 :

http://www.devthought.com/2011/12/22/a-string-is-not-an-error/

그것은 제대로, 등, 스택 추적을 보존 사용자 정의 오류 객체를 정의하는 방법에 대해 설명합니다. String 또는 기존 오류 객체를 사용하는 오류 생성자를 정의하고 스택 추적과 같은 모든 중요한 정보를 원래 오류에서 도용 할 수 있습니다.

그러면 특별한 경우 오류가 발생하여 오류를 감쌀 수 있으며 정보를 잃지는 않습니다.

관련 문제