2012-08-28 41 views
0

我想制定出完美方式來處理我的應用程序中的錯誤。 我設計了一種方法(見下文),但我很困惑,因爲我失去了原來的錯誤。運行下一個(新的錯誤())在節點保留原始錯誤

在我的代碼,我有這樣的事情(這是一箇中間件):

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(); 
     } 
    } 

不同的文件定義的錯誤:

// 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.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';下一個(ERR);'。 –

+0

好點。所以我會有效地擺脫我創建的自定義錯誤對象(我不喜歡它們),只是在'err'中添加額外信息後'下一個(err)'?我非常喜歡這個計劃。似乎是比我設計的更好的方式去? – Merc

回答

1

看看這篇文章:

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

它說明了如何定義保存堆棧跟蹤等,適當自定義錯誤對象。您可以定義一個錯誤構造函數,它接受一個String或一個現有的錯誤對象,並從原始錯誤中竊取所有重要信息,如堆棧跟蹤。

然後,您可以在自己的特殊情況下包裝任何錯誤的錯誤,並不會丟失任何信息。