我是 javascript 新手,我想知道我应该如何处理错误。更准确地说,我应该什么时候使用异常、返回值、回调或承诺?我目前正在为同步函数使用返回值,为异步函数使用回调/承诺,但我不确定这是一个好的选择,因为我从不使用异常,而且我知道有些人认为它们非常有用,尤其是当同步函数可以将通常的错误值(-1 和 null)作为正确值返回,但在实践中,-1 和 null 都是函数的正确结果是非常罕见的。有人可以告诉我如何选择正确的解决方案吗?
1 回答
返回值的问题不在于没有可供选择的值,而是您需要手动检查它们并将它们传播到堆栈中。
如果通过异常发生错误并且您在任何地方都没有 try-catch,您将崩溃该进程并看到一个很好的堆栈跟踪。该错误可能是代码中的错误(通常是 TypeError 和 ReferenceError),也可能是预期的发生,例如文件不存在。在后一种情况下,您应该添加 try-catch 并处理不存在的文件,在前一种情况下,您不应该添加 try-catch 而是修复错误。
另一方面,如果您忘记检查错误的返回值,那么程序可能会默默地继续处于未定义状态或其他比崩溃更糟糕的结果。还有一个事实是,错误通常是由忘记某些东西引起的,因此需要在任何地方显式检查返回值是不好的。
另一个问题是,即使您检查返回值,您当时可能不知道如何处理它,因此您需要手动进一步传播它,这再次需要手动代码。使用 try-catch,try catch 现在不需要在那里,它可以在可以处理错误的堆栈的更下方(例如在 UI 中显示“出现问题”的消息)。
如果你想用异步代码处理错误,那么你应该使用 Promise。尽管最小的 Promise 实现仍然无法用于此,但它仍然比错误处理带有回调的异步代码早了好几年,这很荒谬,不仅需要手动检查和传播,还需要 2 个不同的错误处理通道:同步和异步。请参阅什么是承诺以及我为什么要使用它们?(免责声明:我是作者)