Javascript es6类型错误

Javascript es6类型错误,javascript,es6-promise,Javascript,Es6 Promise,我希望浏览器在发生类型错误时显示错误消息。 类似于的错误无法读取未定义的属性或未定义的引用 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

我希望浏览器在发生类型错误时显示错误消息。
类似于的错误无法读取未定义的属性未定义的引用

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(…)块中捕获它。
但在第二个例子中,这是一个明显的开发错误,在开发新东西的过程中,这种错误总是发生。我不想捕捉它,我希望浏览器像控制台中的其他错误一样向我显示错误。 我希望能够启用chrome pause on exceptions并查看其他变量的状态。我想在控制台中查看堆栈跟踪。
我希望它表现得像一个正常的错误


有什么想法吗?

chrome选项卡中有一个选项暂停捕获的异常,我启用了该选项,并且暂停异常功能现在运行良好。

与同步代码中的异常不同,同步代码中的异常会在代码返回空闲时立即失效,浏览器通常不知道承诺链的逻辑端,在这里异步错误可能被视为未捕获。链毕竟是动态组装的,因此最好在链的逻辑端终止一个最终的
.catch
,即空闲的异步等价物

拥有一个最终的
.catch(e=>console.error(e))
对我来说似乎非常合理,但您是对的,浏览器显示这些错误的方式与未捕获的异常不同。如果希望它们看起来相同,可以使用以下技巧:

.catch(e => setTimeout(() => { throw e; }))
这将在下一个循环中抛出包含原始堆栈跟踪和行号的
e
,在承诺链之外,没有任何东西会捕获它,并将报告为未捕获。我们使用
setTimeout
来克服
.catch
的默认行为,即捕获链中的任何异常,以防您打算继续链接


有了这一点,我希望您看到“逻辑”错误和其他错误之间的任何区别都是无关紧要的。任何到达链尾的错误对链来说都是致命的,即未捕获(当然,您可以从最终捕获中的其他错误中筛选“逻辑”错误,并根据您的选择以不同的方式显示它们)。

使用第二个示例,我在控制台中遇到以下错误
TypeError:无法设置未定义的属性“otherthing”
。这不是你想要的吗?承诺仍处于挂起状态,但这是另一个问题。我需要错误的行号,堆栈跟踪。@AdamJeffers我也想使用chrome异常中断功能。要获得正确的错误行号,我认为您需要删除catch()?这是一个有趣的问题,但我觉得有必要进一步调查!!FWIW在你的例子中,我在Chrome和Firefox的控制台中都得到了
TypeError
的行号,在Firefox中,我在控制台中也得到了stacktrace。这将在逻辑错误和
TypeError
上暂停,因此这似乎不符合你自己问题的标准。