【发布时间】:2012-07-20 17:10:37
【问题描述】:
在 Visual Basic 中,我只在我的程序头部写了 On Error Resume Next 并且在整个项目中都抑制了错误。
在 C# 中,我非常怀念这个特性。对每个单独的程序进行通常的try-catch 处理不仅非常耗时,而且会带来不良影响。如果遇到错误,即使已处理,代码也不会继续从它发生的那一点开始。使用On Error Resume Next,代码从错误点继续,只跳过导致错误的函数调用。
我还没有深入参与 C#,但也许 C# 中存在比原始 try-catch 更好的错误处理。
我还想知道发生错误的模块或函数名称以及错误消息中的行号。据我所知,Exception 类不提供这些功能。有什么想法(当然是管理,而不涉及我自己的应用程序中的任何流程类)?
您如何处理大型项目中的错误?我希望我不必为每个方法添加try-catch。不知何故,C# 抛出了许多错误 - 这似乎是该语言的典型特征。
我发现可以重新解决我的几个问题的解决方案:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
[STAThread]
static void Main()
{
Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException); //setup global error handler
Application.Run(new Form1());
}
private static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
{
MessageBox.Show("Unhandled exception: " + e.Exception.ToString()); //get all error information with line and procedure call
Environment.Exit(e.Exception.GetHashCode()); //return the error number to the system and exit the application
}
private void button1_Click(object sender, EventArgs e)
{
string s = ""; s.Substring(1, 5); //Produce an error
}
}
【问题讨论】:
-
异常是有意义的。忽略它们就是混乱。
-
这可能是一个不好的迹象,表明您需要全局 try/catch。您的大多数代码不应产生错误,只有在极少数情况下您才会抛出异常。
-
@feedwall:不,您应该找到这些错误并修复它们。您遇到的情况非典型。您可能想开始编写单元测试...
-
这其实是个好问题。它表明 OP 目前正在做各种错误的事情,但它非常清楚地解释了情况,并且答案应该能够给处于相同情况的任何人带来启发。一个好的问题表明一个糟糕的程序员比一个好的程序员的坏问题更有用,IMO :)
-
如果“废话”只是被跳过了,正如你所说,那你为什么要打电话呢? feedwall,我直截了当地告诉你 - 从事过你描述的项目,你的应用程序没有运行良好。数据已损坏。你很幸运没有因此而遭受任何毁灭性的失败(你知道的)。在这里相信我们 - 如果没有该指令,您将制作出更多更高质量的作品。
标签: c# error-handling error-suppression