你应该抓住所有例外吗?

这不是’如何抓住所有例外’而是’你应该抓住所有例外’吗? 在C#.NET中,我注意到了大量的exception。 是否可以计划捕获每个例外?

例如, DirectoryInfo()构造函数抛出4个exception。 我应该计划捕捉这些还是只抓住我能处理的那些? 也许让其他人冒泡到Main() ,然后我有一个捕获所有,然后告诉用户有一个未捕获的exception。 在所有这些可能的例外情况下,您的代码可能会变得比实际代码更多的exception处理。

只捕获那些有意义的处理你编写代码的抽象级别。 大多数exception只会在比抛出exception高得多的情况下捕获。

是的,你是对的。 🙂

您应该捕获您期望的exception – 并且优雅地在您不期望的exception上失败(通过在常规exception处理程序中捕获它们)。

在您的示例中 – 创建DirectoryInfo()可以抛出多个exception – 但没有理由您不能这样做

 try { var di = new DirectoryInfo(somePath); } catch(Exception ex) { // Messagebox/alert the user etc, gracefully exit/cancel/throw if needed } 

可能是你想要捕获安全exception并提供一些其他代码,做得好,但保留你的“一般情况”处理程序

 try { var di = new DirectoryInfo(somePath); } catch(SecurityException ex) { // Carry on but use a default path or something etc } catch(Exception ex) { // Messagebox/alert the user etc, gracefully exit/cancel } 

通常,您应该只捕获您知道如何处理的exception。 冒泡exception的目的是允许代码的其他部分捕获它们,如果它们可以处理它们,那么在一个级别捕获所有exception可能不会得到你想要的结果。

在顶层,您可能希望有一个全能的方式给用户一个友好的错误消息,这可能表示您的程序处理错误,您可能需要弄清楚如何正确处理它。

在某些情况下(例如OutOfMemoryException ),实际上没有办法优雅地处理(除了退出),你绝对应该让那些泡沫至少与UI一起冒出来以获得优雅的退出。

抓住那些你可以想要处理的东西。
逻辑很简单,你会对剩下的“抛出”做什么?
除非你想做什么(逻辑\日志记录\错误消息),你只是要重新抛出然后你没有理由抓住。