我听到这样的观点,您应该完全避免使用try / catch,因为它占用很多资源。那么诺言错误处理会更快吗?还是没关系?
function f(somethingDangerous) { return new Promise((resolve, reject) => { // try { // somethingDangerous(); // resolve(); // } catch (err) { // reject(err); // } // VS somethingDangerous(); resolve(); }).catch((err) => { console.error('Catched: ' + err); }); } f(() => {throw 'DANGEROUS THING';});
UPD :我知道try / catch在内部的异步代码中不起作用。我只是在想是否由于性能问题而有任何避免使用try / catch的理由?以上两种方法之间有什么区别吗?
UPD2 :试着跑我的马:) https://jsperf.com/try-catch-vs- promise
您 只能 将Promises 用于异步功能,而不能用于其他任何功能。不要将它们当作错误的monad来使用,那会浪费资源,它们固有的异步性将使所有事情变得更加繁琐。
当您拥有同步代码时,请使用try/ catch进行异常处理。
try
catch
/* Wrong */ return new Promise(function(resolve, reject) { resolve(x / y); }).catch(err => NaN) /* Right */ try { return x / y; } catch(e) { return NaN; }
当且仅当 你已经有承诺的代码,那么就可以避免在某些情况下:当你想例外拒绝承诺。在这些情况下,您应该只允许对promises进行内置的错误处理,而不要通过一个额外的但毫无意义的try/ catch层使一切复杂化:
/* Wrong */ new Promise(function(resolve, reject) { try { // when used synchronous in the executor callback … resolve(somethingSynchronous()); } catch (e) { reject(e); } }); /* Right */ new Promise(function(resolve, reject) { … resolve(somethingExceptionally()); }); /* Wrong */ ….then(function(res) { try { … return somethingExceptionally(); } catch(e) { return Promise.reject(e); } }).… /* Right */ ….then(function(res) { … return somethingExceptionally(); }).…