Javascript自定义异常处理?

Javascript自定义异常处理?,javascript,exception,design-patterns,exception-handling,Javascript,Exception,Design Patterns,Exception Handling,在Python中,有一个很好的模式,如果使用较少的话,您可以遵循它。假设您刚刚开发了这个整洁的Frobnosticator库。您可以这样做: try: do_all_the_things() except FrobnosticatorError: print('Oh noes! We forgot to catch an error somewhere!') except: print("Ugh. Something broke, but at least it wasn

在Python中,有一个很好的模式,如果使用较少的话,您可以遵循它。假设您刚刚开发了这个整洁的Frobnosticator库。您可以这样做:

try:
    do_all_the_things()
except FrobnosticatorError:
    print('Oh noes! We forgot to catch an error somewhere!')
except:
    print("Ugh. Something broke, but at least it wasn't something we threw!")
exc.py

class FrobnosticatorError(Exception): pass
class FrobnosticateConfigNotFoundError(FrobnosticatorError, FileNotFoundError): pass
...  # whatever other kinds of errors you want.
这允许您将整个应用程序包装为如下内容:

try:
    do_all_the_things()
except FrobnosticatorError:
    print('Oh noes! We forgot to catch an error somewhere!')
except:
    print("Ugh. Something broke, but at least it wasn't something we threw!")
现在我正在开发一个节点+咖啡脚本应用程序,它既是服务器端代码,也是客户端代码。不幸的是,我们有点落后,运行Node
v6.4.0
和Coffescript v1,如果这有什么不同的话

我希望在我们的代码中使用这种模式——它将使很多事情变得更干净

我搜索了一些不同的东西,比如
javascript自定义异常处理
,但我没有找到任何这样做的好例子

我正在想象制作一个类似于
lib/client/Exceptions.coffee的东西,它包含了所有这些异常,我们将在整个代码库中使用这些异常


这似乎是一个合理的计划,还是在Javascript中这是一件可怕的事情?有没有更好的方法来设计我们的应用程序,以便我们能够明确地知道哪些错误来自我们的代码,哪些错误来自我们正在使用的其他库?

您可以构建一个自定义错误类来扩展错误:

class CustomError extends Error { /*...*/ }
您基本上可以在javascript中抛出所有内容,但使用error类可以获得堆栈跟踪:

throw "something"; // no stacktrace :(
throw new CustomError(""); // stack trace and type :)
捕捉时,您可以根据错误构造函数切换

 try {
  //...
 } catch(error) {
   switch(error.constructor) {
    case CustomError:
    //...
    break;
  }
}
有没有更好的方法来设计我们的应用程序,以便我们能够明确地知道哪些错误来自我们的代码,哪些错误来自我们正在使用的其他库

要区分这些错误,只需在自定义错误上设置一个属性:

CustomError.protototype.custom = true;
那么它就很简单了:

 catch(error) {
   if(error.custom) { /*...*/ } else { /*...*/ }
}

JavaScript也有例外,与Python相同。您可以用同样的方式使用它们。我想您想要这样:我所理解的是,您需要根据异常的类型来处理异常。如果我对你的问题有一个正确的理解,可以帮助你。使用构造函数或者
instanceof
?@wayneWerner不重要,但是
If(error instanceof CustomError){…}else If(error instanceof OtherError){…}
有点重复。我认为问题的关键是定义错误类的层次结构,然后捕获超类。这需要使用
instanceof
,因为
error.constructor
将是叶类。@barmar这将是解决此问题的另一种方法。