比多个catch块更优雅的exception处理?
使用C#,有没有更好的方式来处理多种types的exception,而不是一堆丑陋的catch块?
什么被认为是这种情况下的最佳做法?
例如:
try { // Many types of exceptions can be thrown } catch (CustomException ce) { ... } catch (AnotherCustomException ace) { ... } catch (Exception ex) { ... }
在我看来,一堆“丑陋”的catch块是处理这种情况的最好方法。
我更喜欢这个的原因是它非常明确。 你明确地说明你要处理哪些exception,以及如何处理。 在大多数情况下,尝试将处理合并为更简洁forms的其他forms会使可读性下降。
我的build议是坚持这一点,并处理你希望明确处理的exception,每个都在自己的catch块中。
我同意里德:这是最好的方法。
我会添加这些评论:
只有抓住你要做的事情。 如果你不能解决这个问题,那么捕捉一个特定的exception是没有意义的。
不要过度使用catch块。 在许多情况下,你不能解决exception,最好是让exception冒泡到一个中心点(如Page_Error),并抓住它。 然后,您loggingexception并向用户显示消息。
关于唯一可以做的其他事情是模拟VB.NET的exceptionfilter:
try { DoSomething(); } catch (Exception e) { if (!ex is CustomException && !ex is AnotherCustomException) { throw; } // handle }
有时候这样比较好,有时候不会。 如果在处理程序中有一些我想要的常见逻辑,我主要使用它,但是exception不共享基本types。
不幸的是, C#没有像VB.NET这样的用户exceptionfilter ,所以你仅限于:
- 把一个共同的祖先赶上所有的例外。 这可能是也可能不是你想要的,因为可能有其他的后代exceptiontypes,你不想捕捉。
- 将exception处理逻辑移入另一个方法,并从每个处理程序中调用。
- 重复每个处理程序的exception逻辑。
- 将exception处理逻辑移动到支持filter的语言(如VB.NET)中。
如果你需要写一大堆这样的代码,我会build议检查一些AOP框架。 我个人使用PostSharp 。 那么你可以隐藏所有的exception处理代码到方面。
您应该检出企业库exception处理块 。 它允许通过策略(包装策略,传播策略,replace策略,日志logging策略等)对例外进行更好的控制。您可以使用它来标准化代码exception块的方式,并使用configuration来精确处理特殊types的例外。
这样不好吗?
如果你只想处理一个exception:
try { // Many types of exceptions can be thrown } catch (TheExceptionIWantToHandle ex) { // handle it } catch (Exception ex) { // suppress all other exceptions }
如果你想处理除一个以外的所有exception:
try { // Many types of exceptions can be thrown } catch (TheExceptionIDoNotWantToHandle ex) { // suppress all other exceptions } catch (Exception ex) { // handle it }
好,不好?
只抓住你需要解决的具体和离开
catch(Exception e) { }
对于其他任何东西(或跳过它,并给这个例外的堆栈)