WinForm中的异常处理

时间:2011-07-31 17:37:21

标签: c# winforms exception-handling

我是C#编程的初学者。我在使用表单构建应用程序时遇到了小问题。我将尝试在我的能力和经验中正确解释它。当我试图处理由Form1中实例化的Class1引起的异常时遇到的问题。假设我在Class1中有函数“public int Calc(int a,int b)”。在Form1中,我已经将这个类实例化为“Calc”函数。如果我想传达一个错误(f.e:除以零),我必须将函数调用包装到try / catch元素中:

// Form1中:

Class1 C1 = new Class1();
int a = 5;
int b = 0;
int c = 0;

try{
   c = C1.Calc(a,b)
}
catch(DivideByZeroException e)
{
   // some error handling code
}

...我认为这个例子不是正确的OOP技术所以我不得不决定将try / catch元素直接放入Class1:

// Class1的:

public int Calc(int a, int b)
{
    int c = 0;
    try{
      c = a/b;
    }
    catch(DivideByZeroException e)
    {
      // .........
    }
    return c;
}

...问题是,如何将消息(DivideByZeroException e)添加到我的Form1中以便能够处理并发送消息。我不想在Form1中创建一些静态函数只是为了从Class1到达它的MessageBox类,因为它没有在适当的OOP功能和Class1的可重用性方面有所作为。我已经阅读过关于事件和委托(我理解的是类似于C ++的函数的简单指针),但它有点令人困惑,我没有将这种技术应用到我的代码中。能否请你写一个简单的例子来指出我正确的方向。

谢谢你们

Cembo

5 个答案:

答案 0 :(得分:7)

正确的技术确实是第一个。如果你无法在你的功能中处理它,那么你就没有尝试过。将异常处理放在可以处理异常的地方,程序可以继续(或正常退出),并以适当的方式通知用户错误。

答案 1 :(得分:2)

我建议您在Program.cs文件

中的应用程序中实现以下代码
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());

        // -----------------
        Application.ThreadException += Application_ThreadException;
        // -----------------
    }

    static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
    {
        // Handle your exception here...
        MessageBox.Show(string.Format("There is an error\n{0}", e.Exception.Message));
    }

这将在整个应用程序中捕获未处理的异常。

答案 2 :(得分:1)

为了让它冒泡到调用UI的范围内,你需要在捕获时抛出异常,或者更好的是,不要抛出异常 - 因为除以零将导致CLR抛出必要时例外。你可以在这里进行简单的检查,而Calc API调用可能仍然会抛出异常。

例如,只需检查Calc来电之前的数据:

if (a > 0 && b > 0)
{
    var result = Calc(a, b);
}
else 
{
    //tell the user to input valid data
}

Calc方法中,您可以执行类似的检查并抛出相关的异常:

public int Calc(int a, int b)
{
    if (a <= 0) throw new ArgumentException("appropriate message here");
    if (b <= 0) throw new ArgumentException("appropriate message here");
    ...
}

这里的想法是防止除以零,但在你的情况下它可能有点过分,因为前面的例子表明你基本上可以提供相同的行为,但是现在你需要捕获异常:

try
{
    var result = Calc(a, b);
}
catch //use appropriate exception catches
{
     //tell the user to input valid data
}

答案 3 :(得分:0)

public int Calc(int a, int b)
    {
        int c = a/b;
    }

使用您需要的重要逻辑,保持简洁明了。

然后首先在表单中处理错误。

答案 4 :(得分:-4)

一种简单的方法可能是将您的方法更改为类似

的方法
public int Calc(int a, int b, out string error)
{
    error = string.empty;
    int c = 0;
    try
    {
      c = a/b;
    }
    catch(DivideByZeroException e)
    {
         error = e.ToString();
    }
    return c;
}

现在在来电者中你可以查看

string error; 
int res = Calc( 1, 2, out error);
if(!string.isnullorempty(error)
{
    //error has occured
    messagebox.show(error);
}
else
{
    //no error
    // you can proceed noramlly
}