使用C#,是否有更好的方法来处理多种类型的异常,而不是一堆丑陋的catch块?
对于这种情况,最佳做法是什么?
例如:
try
{
// Many types of exceptions can be thrown
}
catch (CustomException ce)
{
...
}
catch (AnotherCustomException ace)
{
...
}
catch (Exception ex)
{
...
}
答案 0 :(得分:70)
在我看来,一堆“丑陋”的捕获块是处理这种情况的最佳方法。
我更喜欢这个的原因是它非常明确。您明确说明了要处理的异常以及应如何处理这些异常。在大多数情况下,尝试将处理合并为更简洁形式的其他形式会失去可读性。
我的建议是坚持这一点,并处理你希望明确处理的异常,每个异常都在他们自己的catch块中。
答案 1 :(得分:21)
我同意里德:这是最好的方法。
我会添加这些评论:
只抓住你要做的事情。如果你无法解决问题,那么抓住一个特定的例外是没有意义的。
不要过度使用catch块。在许多无法解决异常的情况下,最好让异常气泡到达中心点(例如Page_Error)并在那里捕获它。然后,您记录该异常并向用户显示一条消息。
答案 2 :(得分:15)
关于您可以做的唯一其他事情是模拟VB.NET的异常过滤器:
try {
DoSomething();
} catch (Exception e) {
if (!ex is CustomException && !ex is AnotherCustomException) {
throw;
}
// handle
}
有时这更好,有时候不是。如果在处理程序中有一些我想要的常见逻辑,我主要使用它,但异常不共享基类型。
答案 3 :(得分:10)
不幸的是,C# does not have user exception filters就像VB.NET一样,所以你只限于:
答案 4 :(得分:5)
答案 5 :(得分:2)
您应该查看企业资源库Exception Handling block。它允许通过策略(包装策略,传播策略,替换策略,日志策略等)对异常进行更精细的控制。您可以使用它来标准化编写异常块的方式,并使用配置来精确处理发生的情况特殊类型的例外。
答案 6 :(得分:0)
这种方式不好吗?
如果您只想处理一个例外:
try
{
// Many types of exceptions can be thrown
}
catch (TheExceptionIWantToHandle ex)
{
// handle it
}
catch (Exception ex)
{
// suppress all other exceptions
}
如果你想处理除一个以外的所有异常:
try
{
// Many types of exceptions can be thrown
}
catch (TheExceptionIDoNotWantToHandle ex)
{
// suppress all other exceptions
}
catch (Exception ex)
{
// handle it
}
好,不好?
答案 7 :(得分:-6)
仅抓住您需要解决的问题并离开
catch(Exception e)
{
}
用于其他所有内容(或跳过它并将此异常提供给堆栈)