es6 承诺 swallow 类型错误
es6 promises swallow type errors
我希望浏览器在发生类型错误时显示错误消息。
像 cannot read 属性 something of undefined 或 undefined reference.
这样的错误
new Promise(function(resolve,reject){
// do stuff ...
reject('something logical is wrong');
}).catch(e => console.error(e));
new Promise(function(resolve,reject){
// do stuff, and a syntax error :/
var a = { };
a.something.otherthing = 1; /* we have an error here */
// ...
}).catch(e => console.error(e));
在第一个例子中,错误是一个逻辑错误,可以在 catch(..) 块中 catch 它.
但在第二个例子中,这是一个明显的开发错误,在开发新东西时经常发生。我不想捕捉到它,我希望浏览器像控制台中的其他错误一样向我显示错误。
我希望能够打开 chrome 异常暂停 并查看其他变量的状态。我想在控制台中查看堆栈跟踪。
我希望它表现得像 正常 错误。
有什么想法吗?
chrome 在 Sources 选项卡中有一个选项 Pause on Caught Exceptions ,我启用了该选项并且 出现异常时暂停 功能现在工作正常。
与同步代码中的异常不同,一旦代码 returns 变为 idle,浏览器通常不会 uncaught不知道 promise 链的逻辑末端,即 异步错误 可以被视为未捕获的地方。毕竟链是动态组装的,因此最好在链的逻辑末端用最终的 .catch
终止,即空闲的异步等价物。
最终 .catch(e => console.error(e))
对我来说似乎很合理,但你是对的,浏览器倾向于以不同于未捕获异常的方式显示这些错误。如果你想让它们看起来一样,你可以使用这个技巧:
.catch(e => setTimeout(() => { throw e; }))
这将在下一个循环中抛出 e
,其中包含原始堆栈跟踪和行号,并且在承诺链之外,在那里没有任何东西会捕获它,它将被报告为未捕获。我们使用 setTimeout
来克服 .catch
的默认行为,即在您打算继续链接时捕获链中的任何异常。
有了这个,我希望你明白 "logical" 和其他错误之间的任何区别都是无关紧要的。任何到达链尾的错误对链来说都是致命的,即 uncaught(当然你可以从最终捕获的其他错误中分类 "logical" 并显示它们如果您选择不同。)
我希望浏览器在发生类型错误时显示错误消息。
像 cannot read 属性 something of undefined 或 undefined reference.
new Promise(function(resolve,reject){
// do stuff ...
reject('something logical is wrong');
}).catch(e => console.error(e));
new Promise(function(resolve,reject){
// do stuff, and a syntax error :/
var a = { };
a.something.otherthing = 1; /* we have an error here */
// ...
}).catch(e => console.error(e));
在第一个例子中,错误是一个逻辑错误,可以在 catch(..) 块中 catch 它.
但在第二个例子中,这是一个明显的开发错误,在开发新东西时经常发生。我不想捕捉到它,我希望浏览器像控制台中的其他错误一样向我显示错误。
我希望能够打开 chrome 异常暂停 并查看其他变量的状态。我想在控制台中查看堆栈跟踪。
我希望它表现得像 正常 错误。
有什么想法吗?
chrome 在 Sources 选项卡中有一个选项 Pause on Caught Exceptions ,我启用了该选项并且 出现异常时暂停 功能现在工作正常。
与同步代码中的异常不同,一旦代码 returns 变为 idle,浏览器通常不会 uncaught不知道 promise 链的逻辑末端,即 异步错误 可以被视为未捕获的地方。毕竟链是动态组装的,因此最好在链的逻辑末端用最终的 .catch
终止,即空闲的异步等价物。
最终 .catch(e => console.error(e))
对我来说似乎很合理,但你是对的,浏览器倾向于以不同于未捕获异常的方式显示这些错误。如果你想让它们看起来一样,你可以使用这个技巧:
.catch(e => setTimeout(() => { throw e; }))
这将在下一个循环中抛出 e
,其中包含原始堆栈跟踪和行号,并且在承诺链之外,在那里没有任何东西会捕获它,它将被报告为未捕获。我们使用 setTimeout
来克服 .catch
的默认行为,即在您打算继续链接时捕获链中的任何异常。
有了这个,我希望你明白 "logical" 和其他错误之间的任何区别都是无关紧要的。任何到达链尾的错误对链来说都是致命的,即 uncaught(当然你可以从最终捕获的其他错误中分类 "logical" 并显示它们如果您选择不同。)