2010-11-15 62 views
2

在我们的应用程序中,我们使用其他团队开发的组件。问题是我如何定义的异常处理一个很好的方式比这很好的异常处理

try 
    { 
    someComponent.DoStuff(); 
    } 

    catch (Exception ex) 
    { 
    textLabel= ex.Message; 
    } 

部件无自定义异常类型,也许一个很好的办法做到这一点是定义一个组件特定异常类型,并以某种方式把这个包? 我知道这个问题是非常基本的,但我更感兴趣的是让我们说说如何做是件好事。如果调用另一个没有自定义异常类型的组件,那么如何以优雅的方式处理任何潜在的异常?

+3

看起来像一个完善的解决方案。 – 2010-11-15 17:18:48

+0

组件是否将所有异常重新打包为System.Exception?如果不是,你可以用正常的渔获量来处理它。如果是...祝你好运。 – asawyer 2010-11-15 17:21:38

+1

只是不。你不知道例外有多严重。 – 2010-11-15 18:32:42

回答

1

当你发现一个错误,你可以重新打包它,然后抛出另一个错误,在最基本的层面上,你可能只是增加更多的数据 - 但是,从你的建议,你也可以替换一般错误有一个自定义错误,虽然它不会克服你从组件中获得的响应的限制,但会让代码进一步提升调用堆栈的机会,以更恰当地作出响应。

在短短的最基本的方式将信息添加条款

所以 - 通过抛出一个新的异常与一些额外的文本,同时仍通过原有的例外:现在

catch (Exception ex) 
{ 
    throw new Exception("This is more about where the exception occurred", ex); 
} 

,如果要定义自己的自定义组件异常您将new Exception更改为新的ComponentSpecificException将必要的数据添加到构造函数中,但从未忘记设置内部异常。例外情况还有一个关键值对的数据收集,您可以在其中插入更多信息(通过创建例外,添加数据然后执行抛出)。

这些都是相当通用的 - 从那里开始工作,在那里你不一定能预见到你必须处理的所有异常,不要尝试 - 设置日志记录,以便知道何时有一个通用异常即一个触及最终捕获 - 然后随着时间的推移,在泛型之上添加异常特定的捕获以提供更适当的响应,或者至少将错误打包为较不常规的自定义异常。

不知道我是很好的解释 - 但观念是其难以预见每一个可能的错误,你想有发展以系统的方式您的应用程序,你发现新的异常的策略。

+0

有一点需要注意:如果您使用的是ComponentSpecificException重要的是要正确设置与捕获的异常的原因,通过调用ComponentSpecificException initCause和投掷它返回或通过将捕获的异常的异常(或RuntimeException的)构造函数。否则,您将失去堆栈跟踪信息,正如@Jeff所指出的那样。参见[java.lang.Throwable中]类注释(http://download.oracle.com/javase/6/docs/api/java/lang/Throwable.html) – corriganjc 2010-11-15 21:52:16

+0

你没注意到两“*从未*忘记设置内部异常“?只是好奇而已( - : – Murph 2010-11-16 08:01:03

+0

D'oh,对不起Murph。我的阅读理解能力昨天一直处于历史最低水平。 – 2010-11-16 14:06:52

0

假设你想捕捉每种类型的异常,这个解决方案对我来说看起来很好。

2

理想情况下,您应该让组件开发团队为您做这件事 - 他们希望客户如何识别并处理组件中的错误?确定组件可以引发的异常是良好C#设计的基本组成部分。

如果这不是一个选项,那么在组件顶部实现自己的包装以对其失败案例进行分类是听起来不错的第二好事情,并且非常高贵的你进入讨价还价。

2

如果第三方库的记录不完善(它们没有指定每种方法可能引发的异常),则有可用的工具可以反映到代码中并确定可能抛出的异常。这可能会让人感到有些d((对于任何给定的调用,可以抛出令人惊讶的数量的异常),但原则上优于捕获一般异常类型。这里是执行这种分析的one commercial product

0

要么从您使用组件的知识中,要么使用类似Reflector的东西来分析编译的组件,该组件可能会抛出什么异常?为这些提供异常处理程序是否允许您向用户提供更好的反馈?

0

唯一合理的(更不用说“优雅”)的方式来处理异常是记录他们,如果你不能从中恢复。

然后通知用户出现了问题,并为他们提供再试一次(如果它是一个互动节目)的机会。

如果您的应用程序专门用于.NET开发人员,请继续向他们展示异常消息(尽管Exception.ToString更好,因为它包含堆栈跟踪)。否则,不要在用户界面中显示异常消息 - 这是一个安全漏洞,只会让用户感到困惑。