Javascript自定义异常处理?
在Python中,有一个很好的模式,如果使用较少的话,您可以遵循它。假设您刚刚开发了这个整洁的Frobnosticator库。您可以这样做: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
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!")
现在我正在开发一个节点+咖啡脚本应用程序,它既是服务器端代码,也是客户端代码。不幸的是,我们有点落后,运行Nodev6.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这将是解决此问题的另一种方法。