C# 全球试捕
我知道大家已经讨论了很多,但我还没有找到解决问题的办法 我正在编写一个Silverlight应用程序,其中每个异常都会生成一个MessageBox,上面写着“抱歉给您带来不便” 因为我不能保证我的代码不会出现异常,所以我的同事指示我在每个方法(几百个)中都进行一次尝试捕获,如下所示:C# 全球试捕,c#,silverlight,try-catch,global,C#,Silverlight,Try Catch,Global,我知道大家已经讨论了很多,但我还没有找到解决问题的办法 我正在编写一个Silverlight应用程序,其中每个异常都会生成一个MessageBox,上面写着“抱歉给您带来不便” 因为我不能保证我的代码不会出现异常,所以我的同事指示我在每个方法(几百个)中都进行一次尝试捕获,如下所示: public void Method1() { try { ... } catch (Exception e) { MessageBox.Sh
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);
}
}
[STAThread]
static void Main() {
if (Debugger.IsAttached) {
Run();
return;
}
Application.ThreadException += ApplicationThreadException;
AppDomain.CurrentDomain.UnhandledException += CurrentDomainUnhandledException;
Run();
}
但这似乎太过分了。我曾经读过这样一篇文章,没有使用try-catch,而且会有很多重复的代码,而且代码会变得模糊,难以阅读
我可以使用全局try-catch等替代方法吗?您始终可以处理您可以使用Application.ThreadException和AppDomain.CurrentDomain.UnhandledException属性捕获未处理(和线程)异常 您的主屏幕将如下所示:
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);
}
}
[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只是我用来显示错误通知并给出报告说明的一个表单。在每个方法中尝试捕获是愚蠢的。但是: 您的同事希望您捕获这种程度的异常的原因是什么?您是否让异常滑到了不需要的程度 我有一个与我们的客户已经在使用的产品类似的案例。这是一个类似于silverlight的WPF项目。我的工作是克服旧的坏代码中的错误,这些错误现在还没有人能掌握。该应用程序与windows中的其他程序具有交叉功能,因此无法预见在不同的环境中会出现什么问题 我有这些问题:
OopsBox
,用于在每次捕获中处理一行程序时产生意外错误。每个捕获都有一条尽可能友好的消息,并将脏东西隐藏在展开按钮后面。该框还用于显示预期错误的错误消息,在这些情况下,没有展开按钮,也没有脏东西显示,因为我们知道已经发生了什么错误。
- 用户更容易找到解决方法,因为在错误不严重的情况下,他们不会被抛出上下文
- 当一些意外行为被报告时,过去和现在都更容易理解出什么地方出了问题
- Oops盒子一开始的频率很高,但我相信该产品现在稳定得更快了,而且Oops盒子更为罕见
- 直到今天,当客户的电话出现问题时,我会通过电子邮件从他们那里得到电话号码:李>
- 所有用户和系统端点的大型演练
- 必须重新编写一些逻辑,才能将捕获物放在正确的位置
- 异常应该在造成任何损害之前被捕获,比如将用户抛出上下文,并且在一个合理的级别
- 当用户运行您的程序时,如果发生意外情况,请确保您有一种方法可以为您指明开始查找的位置。为此,我在为此选择的“用户和系统端点”上捕获了其他未处理的异常
- 无论是否为错误框,请尝试找到一种方法,在出现错误时不将用户抛出上下文。虽然很难让它在所有情况下都起作用,但当它发生时是致命的
OutOfMemoryException
,是否确实要尝试并继续运行?。@Oded大多数异常都不是致命的,但很少有人知道如何用引发异常的相同方法处理它们。如果每次出现无法在同一位置处理的异常时应用程序都会终止,那么我们甚至无法启动许多应用程序,更不用说对它们做任何错误处理了。明智的做法是让异常冒泡到(1)知道如何处理它或(2)知道没有更高级别的人知道的人那里。@delnan他没有说每个异常都要终止。但是OP不应该捕获所有常规异常,而只是显示一个messagebox,有时会给用户留下一个中断的无响应程序。@delnan-我的观点是关于全局异常处理程序(顶级处理程序)试图进行pokemon异常处理。应该指出的是,为任何异常显示消息框仍然是一种不好的做法(尤其是那些需要终止应用程序的用户)用户界面首选项这可能不是最专业的做法。显示异常消息框的错误做法?为什么?在用户环境中,用户不知道这意味着什么,这可能会让他们更加困惑