现在,我的 try/catch 块是否能正常工作对我来说是个谜。我将它们设置在代码周围,然后,因为代码中的某些内容是“异步的”,这似乎是一种在操作系统级别分叉到另一个线程/进程的奇特方式,如果它发生在 try/catch 将被忽略代码。
我很好,我只是想知道是否有一些迹象?按照惯例,我理解,如果一个电话要求回调,它是异步的,否则它不是。我明白为什么回调意味着异步,但我担心反过来并不总是正确的:没有什么能阻止我用一个 try/catch 包围一个调用,该调用被加载到一个新的调用堆栈中并且也不要求回调。这对我来说似乎真的很混乱,如果可能的话,我希望对我的 try/catch 进行更多的控制,而不是使用默认回调来处理所有未捕获的异常。
- 是否有语义告诉我代码何时离开当前堆栈?
更新:这是一个例子:
var UserSchema = new mongoose.Schema({
email: {type: String, unique: true},
password: String,
firstName: String,
lastName: String,
created_at: {type: Date, default: Date.now},
updated_at: Date
});
var User = mongoose.model('User', UserSchema);
var users = [
{email: 'foo@bar.com', firstName: 'Justin', lastName: 'Jones'},
{email: 'foo@bar.com', firstName: 'Justin', lastName: 'Jones'}
];
users.forEach(function(user) {
var newUser = new User(user);
newUser.save(function(err, obj) {
if (!err) console.log("Saved: ", obj.email);
});
});
鉴于上面的代码,无法在 save() 中捕获异常,因为它发生在另一个调用堆栈中。当我调用 save() 时,有什么方法可以让我从外部知道这就是即将发生的事情吗?
更新:每个告诉我为此使用处理程序的人都应该阅读这个?显然建议不要处理未在其“线程执行”中捕获的异常,引号是因为它仅像线程一样起作用。