Articles of exception处理

在NodeJS中重新抛出exception,不会丢失堆栈跟踪

如何在nodejs / javascript中重新引发错误或exception,并包含自定义消息。 我有以下代码 var json = JSON.parse(result); 而且我想在发生任何分析错误时将result内容包含在exception消息中。 像这样的东西。 1. try { 2. var json = JSON.parse(result); 3. expect(json.messages.length).to.be(1); 4. } catch(ex) { 5. throw new Error(ex.message + ". " + "JSON response: " + result); 6. } 这里的问题是我失去了我的堆栈跟踪。 有没有办法做到这一点类似于java ? throw new Error("JSON response: " + result, ex);

节点exception处理

节点中处理来自核心节点代码的未处理的期望的最好方法是什么? 我有一个后台进程,运行和爬网的内容,并会运行很长一段时间没有问题,但时常发生意外的exception,我似乎无法妥善处理它。 通常的罪魁祸首似乎是一些networking问题(失去连接),我所做的http调用失败。 我创build的所有函数都遵循FUNCTION_NAME的模式(错误,returned_data),但是在发生错误的情况下,我看不到任何在打印出的调用堆栈中创build的函数,而是显示一些核心节点模块。 我并不担心这些偶发错误及其根本原因,本文的目的只是试图寻找一种处理这些例外的优雅方式。 我试着在我的代码的最上层放一个try / catch,一切都在下面,但是它似乎没有捕获这些exception。 在所有使用任何核心代码的较低级别的函数中使用try / catch是不是很好? 或者有什么方法可以全局捕获所有未处理的exception? 谢谢 克里斯 更新添加堆栈 node.js:201 throw e; // process.nextTick error, or 'error' event on first tick ^ Error: connect Unknown system errno 10060 at errnoException (net.js:642:11) at Object.afterConnect [as oncomplete] (net.js:633:18)

如何使用promise在Javascript中发生exception后重试?

我正在使用蓝鸟承诺库。 我有一系列如下的promisified函数: receiveMessageAsync(params) .then(function(data)) { return [data, handleMessageAsync(request)]; }) .spread(function(data, response) { return [response, deleteMessageAsync(request)]; }) .spread(function(response, data) { return sendResponseAsync(response); }) .then(function(data) { return waitForMessage(data); }) .catch (function(err) { // handle error here }); 偶尔sendMessage将会失败,因为我们假设服务器不能响应。 我希望代码能够一直试图回应,直到成功。 你不能简单地把sendMessage包装到一个catch中,因为它实际上并没有抛出一个exception,我想,它调用了“错误”函数,在这个promisified代码中是底部的“catch”。 所以必须有一些方法来在“catch”部分“重试”发送消息。 问题是,即使我在“catch”的循环中重试,我仍然没有办法跳到promise链并执行剩下的promisified函数。 我如何处理这个? 编辑: 我重试了一个HTTPpost,结果如下所示: function retry(func) { return func() .spread(function(httpResponse) { if (httpResponse.statusCode != 200) { […]

asynchronousJavaScript引发exception没有捕获

基本上,为什么不抓住这个例外? var http = require('http'), options = { host: 'www.crash-boom-bang-please.com', port: 80, method: 'GET' }; try { var req = http.request(options, function(res) { res.setEncoding('utf8'); res.on('data', function (chunk) { console.log('BODY: ' + chunk); }); }); req.on('error', function(e) { throw new Error("Oh noes"); }); req.end(); } catch(_error) { console.log("Caught the error"); } 有人build议这些错误需要用事件发射器或callback(err)来处理(callbackerr,数据签名不是我习惯的) 什么是最好的方式去呢?

带有mysql的NodeJS服务器挂起

我写了一个使用NodeJS,Express,mysql的应用程序,到目前为止一切正常,但是当我的应用程序运行一段时间后,当mysql连接中断,我的应用程序通过这个exception,我的应用程序closures。 Error: read ECONNRESET at errnoException (net.js:901:11) at TCP.onread (net.js:556:19) 从另一个stackquestion我知道,我必须处理这样的未捕获的例外。 process.on('uncaughtException', function(err) { console.log('Caught exception: ' + err); console.log(err.stack); }); 在此之后,我的应用程序不会退出,而是挂起,所以我的问题是如何处理这个exception,以便即使在这个exception和我的应用程序不挂断后,MySQL连接是好的。

node.js套接字exception读取ETIMEDOUT – 如何正确捕获它? 怎么写超时?

我有一个代理服务器,pipe理一堆客户端,并与另一个http服务器通话。 消息被来回发送并导向给客户。 客户端可以做超时,服务器有一个心跳function(每n秒重复一次),发送心跳到clientId映射到套接字连接的所有客户端。 当心跳尝试与不再连接的客户端进行通信,但其套接字仍处于活动状态时,会收到“读取ETIMEDOUT”exception。 我试着暂时将套接字连接的超时设置为2000ms,理论上我的套接字事件处理程序会超时(事件处理程序在tcp服务器部分),但是这并没有发生。 它需要几次心跳死亡。 部分问题肯定是我对如何构造node.js代码缺乏了解,所以如果您有任何build议,我会非常感激他们。 另一个问题是,是否可以单独处理读写超时,或者至less将其分开。 我真正想做的是让我的心跳function成为tcp服务器的一部分,只发送一个心跳(如果在n秒内没有听到客户端的声音),只发送一次心跳。 如果我们超时,那么我们杀死socket,否则我们再等一等。 谢谢! >>$ node –harmony-weakmaps server.js Heartbeat: Sat Feb 18 2012 08:34:40 GMT+0000 (UTC) { sending keep_alive to id:00:00:00:00:00:10 socket:[object Object] } socket:received data: {"id":"00:00:00:00:00:10","m":"keep_alive","success":"true"} Heartbeat: Sat Feb 18 2012 08:35:40 GMT+0000 (UTC) { sending keep_alive to id:00:00:00:00:00:10 socket:[object Object] } socket:received data: {"id":"00:00:00:00:00:10","m":"keep_alive","success":"true"} node.js:201 throw […]

为什么Node.js不能捕捉到我的错误?

var api_friends_helper = require('./helper.js'); try{ api_friends_helper.do_stuff(function(result){ console.log('success'); }; }catch(err){ console.log('caught error'); //this doesn't hit! } 而在do_stuff里面,我有: function do_stuff(){ //If I put the throw here, it will catch it! insert_data('abc',function(){ throw new Error('haha'); }); } 它怎么从来没有logging“发现错误”? 相反,它将堆栈跟踪和错误对象打印到屏幕上: { stack: [Getter/Setter], arguments: undefined, type: undefined, message: 'haha' } Error: haha at /home/abc/kj/src/api/friends/helper.js:18:23 at /home/abc/kj/src/api/friends/db.js:44:13 at Query.<anonymous> (/home/abc/kj/src/node_modules/mysql/lib/client.js:108:11) […]

在抛出的对象中传递错误原因/如何处理现代JavaScript中的错误

我正在开发一个包含parsing器的小型Node.js包。 它一旦发现不可恢复的问题就会抛出。 我已经使用了Java多年,我已经习惯了大量的exception类。 但是这是JavaScript。 我想这是一个风格问题。 我的根本问题是如何通过错误原因赶上块。 我考虑为不同的错误原因创build不同的错误“类”,每个错误都关注每个问题的细节,或者将一个错误类作为属性来保存原因。 让我给你一个处理这两种错误的例子: catch(e) { if(e instanceof FirstError) { … } if(e instanceof SecondError) { … } } catch(err) { if(err instanceof AnError) { if(err.detail === 'becauseOfA') { … } if(err.detail === 'becauseOfB') { … } } … } 哪种方法比较好? 两者都可以工作,但我不喜欢第一个。 在我看来,许多课程都像一个巨大的开销。 编辑: 我同意使用callback(也在这里回答): // One class per error type […]

JavaScript:抛出错误时减less堆栈跟踪(指向调用站点)

我有这样的function: function foo() { throw new Error('`foo` has been removed in favor of `bar`') } 当某人调用foo ,我希望堆栈跟踪(错误输出)指向foo的调用位置,而不是foo的throw行。 例如,我得到这个: $ node test.js /home/ubuntu/tmp/test.js:2 throw new Error('`foo` has been removed in favor of `bar`') ^ Error: `foo` has been removed in favor of `bar` at foo (/home/ubuntu/tmp/test.js:2:9) at Object.<anonymous> (/home/ubuntu/tmp/test.js:5:1) … 我怎样才能得到这个呢? $ node test.js /home/ubuntu/tmp/test.js:5 foo() […]

javascript / node.js中的exception是否会被lambdas捕获?

我有一个node.js服务器,我希望能够处理exception而不崩溃,我有代码有点像下面。 我想知道,所有的事件驱动的迷人和callback和lambdas和所有这一切,我的例外仍然会被我的主要切入点抓住? try { http.get(…, function(results) { // Might get an exception here results.on('data', function () { // Might also get an exception here }); results.on('end', function () { // Might also get an exception here }); }); } catch(e) { // Will the exceptions from the lambdas be caught here? console.log('Nicely caught error: (' […]