我正在尝试测试https连接。 “try”正在执行,但“catch”不缓存错误并根据需要执行代码。
我正在使用node.js
var https = require("https");
try {
https.get({host:'nonsecuredomain.com'}, function(res){});
}
catch(err) {
console.log('maybe an ssl error');
}
events.js:167 throw er; //未处理的'错误'事件^
Error: certificate has expired
at TLSSocket.onConnectSecure (_tls_wrap.js:1049:34)
at TLSSocket.emit (events.js:182:13)
at TLSSocket._finishInit (_tls_wrap.js:631:8)
Emitted 'error' event at:
at TLSSocket.socketErrorListener (_http_client.js:392:9)
at TLSSocket.emit (events.js:182:13)
at emitErrorNT (internal/streams/destroy.js:82:8)
at emitErrorAndCloseNT (internal/streams/destroy.js:50:3)
at process._tickCallback (internal/process/next_tick.js:63:19)
https.get
是异步的。这意味着在网络返回结果或错误时,try
catch
的函数已经返回。
get
返回一个将在错误时发出事件的对象。你应该监听那个'error'事件并处理那里异步抛出的错误:
https.get(url, (res) => {
res.on('data', (d) => {
// do stuff
});
}).on('error', (e) => {
console.error(e); // deal with errors
});
正如提到的taplar,错误发生在另一个线程上,你无法在原始线程上捕获它。
通常async函数返回一个promise,你可以通过asyncFunc()来处理它.track(err => console.error(err.message))
但在这种情况下,异步函数会返回一个事件,因此您需要以这种方式处理它
https.get({host:'foo.bar'}, function onSuccess(res){
res.on('error', (e) => {
console.error(`Got error: ${e.message}`)
})
}).on('error', (e) => {
console.error(`Got error: ${e.message}`)
});