有没有办法全局捕获所有异常,包括Promise异常.例:
window.onerror = function myErrorHandler(errorMsg, url, lineNumber) {
alert("Error occured: " + errorMsg);//or any message
return false;
}
var myClass = function(){
}
var pr = new Promise(function(resolve, react){
var myInstance = new myClass();
myInstance.undefinedFunction(); // this will throw Exception
resolve(myInstance);
});
pr.then(function(result){
console.log(result);
});
// i know right will be this:
// pr.then(function(result){
// console.log(result);
// }).catch(function(e){
// console.log(e);
// });
Run Code Online (Sandbox Code Playgroud)
这个脚本会默默地死掉而不会出错.萤火虫没什么.
我的问题是,如果我犯了一个错误,忘了抓住它有没有办法在全球范围内捕捉到它?
我有一个AngularJS代码:
service.doSomething()
.then(function(result) {
//do something with the result
});
Run Code Online (Sandbox Code Playgroud)
在AngularJS 1.5.9中,当我在该.then()部分中有错误时:
service.doSomething()
.then(function(result) {
var x = null;
var y = x.y;
//do something with the result
});
Run Code Online (Sandbox Code Playgroud)
我收到明确的错误消息:
TypeError:无法读取null的属性"y"
但是在版本1.6中使用相同的代码我得到了一个不同的错误:
可能是未处理的拒绝:{}未定义
我知道这与此更改有关,通过添加.catch()块,单个解决方案非常简单:
service.doSomething()
.then(function(result) {
var x = null;
var y = x.y;
//do something with the result
})
.catch(console.error);
Run Code Online (Sandbox Code Playgroud)
现在我再次拥有我想要的东西:
TypeError:无法读取null的属性"y"
但是如何在不在.catch()每个地方添加块的情况下为整个应用程序获得相同的结果(更详细的错误)?
我测试了建议的解决方案,通过添加:
$qProvider.errorOnUnhandledRejections(false);
Run Code Online (Sandbox Code Playgroud)
但有了这种情况甚至更糟 - 我在控制台中没有任何东西!错误被某处吞没,根本没有记录.我不确定AngularJS 1.6或我的配置是否有问题.
您是否有任何想法如何从1.5.9版"恢复"日志记录行为?
编辑:
添加定制错误处理程序
.factory('$exceptionHandler', function($log) {
return function(exception, cause) {
$log.warn(exception, …Run Code Online (Sandbox Code Playgroud) javascript angularjs angular-promise angular-providers angularjs-1.6
我在Javascript中有一个异步函数,我添加了setTimeout.代码看起来像这样:
let timer;
clearTimeout(timer);
timer =setTimeout(() => {
(async() => {
await this._doSomething();
})();
}, 2000);
Run Code Online (Sandbox Code Playgroud)
setTimeout的puprose是在运行函数之前加2秒.确保用户停止输入.
我现在应该从此函数中删除async/await,因为setTimeout是异步的吗?
任何帮助在这里非常感谢!
我知道如何处理promises中的特定错误但我有时会看到如下代码片段:
somePromise.then(function(response){
otherAPI(JSON.parse(response));
});
Run Code Online (Sandbox Code Playgroud)
有时,我得到无效的JSON,这会在JSON.parse throws 时导致静默失败.一般来说,我必须记住.catch在我的代码中为每个承诺添加一个处理程序,当我不在时,我无法找到我忘记的地方.
如何在代码中找到这些被抑制的错误?
我尝试从 抛出一个错误JSON.parse(),我希望“unhandledrejection”事件会捕获它:
window.addEventListener('unhandledrejection', event => {
console.log('unhandledrejection:', event.reason?.message || event.reason);
});
Promise.resolve("{")
.then((data) => {
JSON.parse(data)
});Run Code Online (Sandbox Code Playgroud)
但是(Chrome 的)控制台中出现 Uncaught (承诺):
Uncaught (in promise) SyntaxError: Unexpected end of JSON input
at JSON.parse (<anonymous>)
...
Run Code Online (Sandbox Code Playgroud)
我尝试了更多抛出错误的方法,它们都可以被捕获:
Uncaught (in promise) SyntaxError: Unexpected end of JSON input
at JSON.parse (<anonymous>)
...
Run Code Online (Sandbox Code Playgroud)
我试图重新抛出错误,但它仍然无法被“unhandledrejection”捕获:
window.addEventListener('unhandledrejection', event => {
console.log('unhandledrejection:', event.reason?.message || event.reason);
});
Promise.resolve("{")
.then((data) => {
eval(data)
}); // unhandledrejection: SyntaxError: Unexpected end of input
Promise.resolve()
.then(() => {
throw 123
}); …Run Code Online (Sandbox Code Playgroud)fields在以下代码中未定义,但在发生错误时它不会记录到控制台.在这个具体的例子中,为什么以及实际处理这个问题的方法是什么?
"Testing"记录到控制台(第2行),但未报告未定义的变量fields(第4行).错误在API响应(第5行)中返回,但没有相关信息,如行#,堆栈跟踪等.
如何将此日志中的错误发送到控制台,为什么不是?
export function post(req, res) {
console.log("Testing")
User.create( getFields(req, ["name_first", "name_last"]) )
.then(user => respondJSON (res, fields, { status: 201 }))
.catch(err => respondError (res, err))
}
Run Code Online (Sandbox Code Playgroud)
由于catch响应错误,我得到以下API响应:
{
"error": true,
"data": {
"message": "fields is not defined"
}
}
Run Code Online (Sandbox Code Playgroud)
我正在使用Babel 6和babel-node通过NPM脚本运行我的代码.我也在使用摩根伐木.删除用于记录的中间件不会改变错误输出.
我正在处理一个需要报告错误发生的网络工作者.通常,我可以worker.onerror用来监听从工作者抛出的任何错误.但是,当错误发生在Web工作者的承诺中时,我无法弄清楚如何将错误重新发送回来worker.onerror.
请原谅奇怪的代码片段,因为这似乎是证明工人行为的唯一方法.(工作人员在HTML部分中定义).
function getInlineJS() {
var js = document.querySelector('[type="javascript/worker"]').textContent;
var blob = new Blob([js], {
"type": "text\/plain"
});
return URL.createObjectURL(blob);
}
var worker = new Worker(getInlineJS());
worker.onerror = function(err) {
document.getElementById('errors').innerHTML +=
"error " + err.message + '\n';
}
worker.onmessage = function (msg) {
console.log("message recieved", msg);
document.getElementById('messages').innerHTML +=
"message " + msg.data + '\n';
}
worker.postMessage("run");
worker.postMessage("promise");Run Code Online (Sandbox Code Playgroud)
should write "Normal Error and In Promise Error" below and in console (promise error only occurs in console …Run Code Online (Sandbox Code Playgroud)我所指的规范是http://promises-aplus.github.io/promises-spec/.
使用时then(),您可以返回一个承诺,并在您希望时拒绝承诺,或者您可以抛出异常拒绝承诺.
为什么api不是以这种方式设计的,对于then函数来说,它是像原始的promise构造函数一样传递一个解析和拒绝函数?
许多语言中的异常都很繁重(我也假设在javascript中),所以看起来很奇怪他们将它们用作流控制的选择.创建一个全新的promise对象并返回它,只是为了拒绝它,增加了代码膨胀IMO.如果抛出异常(例如语法错误,或者在未定义的对象上调用函数等),调试也会变得更难.
我有一个 redux-form,它有一个 handleSubmit 函数,我用它来进行一些异步 http 服务器身份验证。如果由于某种原因身份验证失败,我想抛出一个 redux-form 错误。如果我抛出“SubmissionError”,我会收到一条错误消息:Uncaught (in promise)
我的代码:
class MyLoginForm extends Component {
handleSubmit({ email, password }) {
axios.post("http://API_SERVER/login", null, { withCredentials: true, auth: { username: email, password: password } })
.then((response) => {
console.log('HTTP call success. JWT Token is:', response.data);
})
.catch(err => {
console.log(err)
>>>> WHAT TO DO TO CONVEY THE ERROR IN THE REDUX-FORM <<<<
if (err.response) {
if (err.response.status !== 200) {
console.log("Unexpected error code from the API server", err.response.status);
throw new …Run Code Online (Sandbox Code Playgroud)这是我对嵌套诺言的第一枪。我使用的是bluebird库,但我认为对于所有的Promise库都是相同的。
从高层次上讲,这就是我想要做的:
myService.getSomeData(url)
.then((data) => {
myOtherService.getMoreData(data.uniqueId)
.then((thisDataIsAnArray) => {
//loop over the data above and do something
});
});
Run Code Online (Sandbox Code Playgroud)
getMoreData()应该进行X次服务调用并将结果存储在X个元素数组中。这是我开始迷路的地方,因为我不确定如何制作此方法以及应该从中得到什么。我已经在蓝鸟那里taken了几口Promise.all,Promise.map但是却挣扎了,以为我会征求建议。
javascript ×9
promise ×5
es6-promise ×2
node.js ×2
angularjs ×1
asynchronous ×1
bluebird ×1
ecmascript-6 ×1
exception ×1
express ×1
reactjs ×1
redux ×1
redux-form ×1
settimeout ×1
unhandled-promise-rejection ×1
web-worker ×1