2017-10-05 136 views
0

如何處理自己生成的錯誤以及Javascript承諾中的庫/未處理的異常?我面臨的問題是由承諾方法的「全部」性質產生的。承諾處理錯誤

舉例來說,我有以下代碼:

somePromiseFunction() 
.then(result => { 
    // External library or behaviour 
    someCodeThatCanThrowExceptions() 

    if (result.code === 1) { 
     throw 'My own exception' 
    } 
}) 
.catch(err => { 
    // how do I know if this is an exception I don't know or something 
    // that I do want to actually handle? 
}); 

很多事情都可能出錯的then()鏈,外部庫可以拋出異常等。例如,當這樣的事情發生時,我想打印「通用錯誤」。

但我也想驗證代碼並提前退出(就像我在這個例子中做的那樣),並且在這種情況下實際上打印了我自己的消息「我自己的錯誤」。

如何處理我的「退出早期」throw s和所有不同的事情,而不是在執行代碼期間可能出錯?

+1

讓.catch中的代碼檢查'if(err ==='我自己的異常')'後面跟着你的自定義處理程序,其次是一般處理程序嗎? –

+0

不要宣傳[此圖書館](https://github.com/AlexanderMac/n-custom-errors),但它可以滿足你的需求。給出了註冊自定義錯誤的可能性,並檢查拋出的錯誤是否是自定義錯誤。 – alexmac

+0

[永遠不會拋出字符串。](https://stackoverflow.com/a/26020867/1048572) – Bergi

回答

1

在你的具體情況下,你拋出一個簡單的字符串異常,所以你必須看看值。

function go() { 
    return new Promise(function(resolve, reject) { 
    throw 'My Exception'; 
    }); 
} 

const x = go() 
    .then(function() { 

    }) 
    .catch(function(ex) { 
    if (ex === 'My Exception') { 
     alert('It was mine'); 
    } 
    }); 

如果您創建更多特殊的例外,您可以測試類型,而不是確切的字符串。下面是與下面的window.Error圖案(即,它具有一個名字和一個消息)可被型測試的異常的例子:

var MyError = (function() { 
    function MyError(message) { 
    this.message = message; 
    this.name = 'MyError'; 
    } 
    return MyError; 
}()); 

function go() { 
    return new Promise(function(resolve, reject) { 
    throw new MyError('Something went wrong'); 
    }); 
} 

const x = go() 
    .then(function() { 

    }) 
    .catch(function(ex) { 
    if (ex instanceof MyError) { 
     alert('It was mine'); 
    } 
    }); 

這具有從測試去耦郵件的益處以確定它是否是你的錯誤與否。