# 异步错误处理
想象一下以下代码:
function one() {
two(function(err) {
if(err) throw err;
console.log("two finished");
});
}
function two(callback) {
setTimeout(function () {
three(function(err) {
if(err) return callback(err);
console.log("three finished");
callback();
});
}, 0);
}
function three(callback)
{
setTimeout(function () {
four(function(err) {
if(err) return callback(err);
console.log("four finished");
callback();
});
}, 0);
}
function four(callback) {
setTimeout(function(){
callback(new Error());
}, 0);
}
one();
如果您运行上述代码,您将会看到如下的错误信息:
Error
at Timer.callback (example.js:34)
对于debug来说,这是非常蛋疼的。
为了简化这一点,ES4X将所有的异常堆栈信息整合在了一起,你可以使用一个函数包主它,每次只需要处理回调而不是直接传递错误
var asyncError = require('async-error');
var fs = vertx.fileSystem();
function one() {
two(function (err) {
if (err) {
console.trace(err);
test.complete();
return;
}
console.log("two finished");
should.fail("Should not reach here");
});
}
function two(callback) {
setTimeout(function () {
three(function (err) {
if (err) {
setTimeout(function () {
callback(asyncError(err));
}, 0);
return;
}
console.log("three finished");
callback();
});
}, 0);
}
function three(callback) {
setTimeout(function () {
four(function (err) {
if (err) {
setTimeout(function () {
callback(asyncError(err));
}, 0);
return;
}
console.log("four finished");
callback();
});
}, 0);
}
function four(callback) {
setTimeout(function () {
fs.readFile("durpa/durp.txt", function (ar) {
if (ar.failed()) {
callback(asyncError(ar));
}
});
}, 0);
}
one();
当文件 durpa/durp.txt
不存在时,您将会看到:
Error: File not found!
at stacktraces/jserror.js:24:20
at stacktraces/jserror.js:40:20
at stacktraces/jserror.js:53:14
at stacktraces/jserror.js:53:25
at classpath:io/reactiverse/es4x/polyfill/global.js:25:18
上述错误发生在JS中,亦或是:
io.vertx.core.file.FileSystemException: java.nio.file.NoSuchFileException: durpa/durp.txt
at <async>.<anonymous> (stacktraces/index.js:30)
at <async>.<anonymous> (stacktraces/index.js:46)
at <async>.<anonymous> (stacktraces/index.js:61)
at io.vertx.core.file.impl.FileSystemImpl$13.perform(FileSystemImpl.java:740)
at io.vertx.core.file.impl.FileSystemImpl$13.perform(FileSystemImpl.java:732)
at io.vertx.core.impl.ContextImpl.lambda$executeBlocking$1(ContextImpl.java:275)
at io.vertx.core.impl.TaskQueue.run(TaskQueue.java:76)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.nio.file.NoSuchFileException: durpa/durp.txt
at sun.nio.fs.UnixException.translateToIOException(UnixException.java:86)
at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102)
at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107)
at sun.nio.fs.UnixFileSystemProvider.newByteChannel(UnixFileSystemProvider.java:214)
at java.nio.file.Files.newByteChannel(Files.java:361)
at java.nio.file.Files.newByteChannel(Files.java:407)
at java.nio.file.Files.readAllBytes(Files.java:3152)
at io.vertx.core.file.impl.FileSystemImpl$13.perform(FileSystemImpl.java:736)
... 7 more
上述错误发生在Java中
← GraalVM Worker API →