我知道try catch已经讨论了很多,但我还没有找到解决问题的方法。
我正在编写一个Silverlight应用程序,其中每个异常都应生成一个MessageBox,上面写着“抱歉给您带来的不便”。
由于我无法保证我的代码可以免除异常,我的同事已经指示我尝试捕获每种方法(几百个),如下所示:
public void Method1()
{
try
{
...
}
catch (Exception e)
{
MessageBox.Show("Something went wrong, we apologize for the inconvenience. \n" + e.Message);
}
}
public void Method2()
{
try
{
...
}
catch (Exception e)
{
MessageBox.Show("Something went wrong, we apologize for the inconvenience. \n" + e.Message);
}
}
但它似乎太过分了。我已经读过一个不会以这种方式使用try catch加上会有很多重复的代码加上代码将被混淆并且难以阅读。
有没有其他选择,比如我可以使用的全球尝试捕获?
感谢名单! /麦克
答案 0 :(得分:9)
答案 1 :(得分:5)
每种方法中的尝试捕获和单一方法是愚蠢的。但是:
您的同事希望您在何种程度上捕获异常的原因是什么?你是否让异常滑落到他们不想要的程度?
我有一个与我们的客户已经使用的产品类似的情况。这是一个类似于silverlight的WPF项目。我的工作是克服旧的错误代码中的错误,没有人仍然与我们合作掌握。应用程序与Windows中的其他程序交叉功能,无法预见在不同环境中可能出现的问题。
我有这些问题:
我的方法是:
OopsBox
,用于在每个catch中处理单行的意外错误。每个catch都有一个尽可能友好的消息,并隐藏在扩展按钮后面的脏东西。该框还用于预期错误的错误消息,在这些情况下,没有展开按钮,也没有脏东西显示,因为我们已经知道出了什么问题。
我们获得了这个:
成本:
例外情况应该在他们造成任何损害之前被捕获,比如将用户从背景中抛弃,并且处于有意义的水平。
当用户运行您的程序并发生意外情况时,请确保您可以指明从哪里开始查找。我通过捕获为此目的而选择的“用户和系统端点”的其他未处理的例外来做到这一点。
错误框与否,尝试找到一种方法,当出现问题时不会将用户抛弃上下文。虽然很难让它在所有情况下都有效,但是当它发生时它是致命的。
答案 2 :(得分:4)
您可以使用Application.ThreadException和AppDomain.CurrentDomain.UnhandledException属性捕获未处理的(和线程)异常。
你的主要看起来像这样:
[STAThread]
static void Main() {
if (Debugger.IsAttached) {
Run();
return;
}
Application.ThreadException += ApplicationThreadException;
AppDomain.CurrentDomain.UnhandledException += CurrentDomainUnhandledException;
Run();
}
请注意调试器检查,这样调试器就可以在开发时捕获这些异常。
Run功能非常简单
static void Run() {
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MainForm());
}
然后是两个异常处理程序。
static void ApplicationThreadException(object sender, ThreadExceptionEventArgs e) {
ErrorInformationDialog eid = new ErrorInformationDialog(e.Exception.Message, e.Exception);
eid.ShowDialog();
}
static void CurrentDomainUnhandledException(object sender, UnhandledExceptionEventArgs e) {
ErrorInformationDialog eid = new ErrorInformationDialog(e.ExceptionObject as Exception);
eid.ShowDialog();
}
ErrorInformationDialog只是我放在一起显示错误通知并提供报告说明的表单。