我该如何处理两个类之间的异常?

时间:2012-08-28 21:22:49

标签: c# exception error-handling

查看代码评论中的问题。

我有两节课。

这是主要的类(第1类):

//this class contains controls on the form.
Class MyApp
{
    private void btnProcessImages_Click(object sender, EventArgs e)
    {
        /* if an error occurs in the method below, I want to: 
               1. Show the error message, and
               2. Based on fail or success do different actions.
        */
        Calculate.DevideNumbers(2, 0);
    }

    /* 
       if the above is successful, I want to do 1 thing, 
       if not, i want to do something else (with controls on THIS form).
    */ 

}

这是第二堂课:

Class Calculate
{
     public double void DivideNumbers(int num1, int num2)
     {
           double result = 0.00;

           try
           {
                result = num1/num2;
                return result;
           }
           catch (Exception)
           {
                throw;
           }  
     }
}

我的问题是: DivideNumbers()将错误报告回调用方法的最佳方法是什么?

调用者需要知道是否存在错误以及错误消息是什么。我如何发送这两个信息的调用方法?

5 个答案:

答案 0 :(得分:3)

删除DivideNumbers中的try catch,让异常冒泡。

然后在try catch块中将调用传递给Calculate.DevideNumbers(2, 0);

//this class contains controls on the form.
Class MyApp
{
    private void btnProcessImages_Click(object sender, EventArgs e)
    {
      try
      {
          Calculate.DevideNumbers(2, 0);
      }
      catch (Exception e)
      {
           DoStuff();
           Return();
      }
    }
}

答案 1 :(得分:1)

你可以这样做:

class MyApp : Form
{
    //...

    bool erroroccurs = false;
    private void btnProcessImages_Click(object sender, EventArgs e)
    {
          try
          {
              Calculate.DevideNumbers(2, 0);
          }
          catch(Exception ex)
          {
              MessageBox.Show(ex.Message);
              erroroccurs = true;
          }
    }
}

答案 2 :(得分:1)

删除你的DevideNumbers方法中的try catch,我没有用,因为你没有抓到任何东西。最好将try catch int放在btnProcessImages_Click方法中,然后在那里添加错误处理。

答案 3 :(得分:0)

首先,您不应在try catch上添加DevideNumbers块,因为根据您提供的代码,您对该例外无效。您只需要捕获异常,以防计划对其执行某些操作(例如记录错误)

异常会冒泡,所以你不需要try catch阻止

在调用者方法上,您可以在调用DevideNumbers时捕获任何异常并做出您的魔法。

答案 4 :(得分:0)

这是我的建议。请注意我改变的一些不太明显的事情。

  • DivideNumbers返回double(您返回了一个值,但该方法已标记为void
  • 我将一个int投放到double中的DivideNumbersint除以int始终为int。这可能会产生意外结果,除非您希望/期望隐式舍入。
  • 异常处理是在另一个类中完成的,因为它似乎是你想要处理的地方。 I.E.如果您的唯一目的是重新抛出异常,捕获异常的重点是什么?只是让它冒出来。

...

Class MyApp
{
    private void btnProcessImages_Click(object sender, EventArgs e)
    {
        try 
        {
            double result = Calculate.DevideNumbers(2, 0);
            HandleSuccess(result);
        }
        catch (Exception ex)
        {
            HandleError(ex.Message);
        }
    }

    private void HandleSuccess(double result)
    {
        // Do whatever you do when no errors occur
    }

    private void HandleError(string errorMessage)
    {
        // Do whatever you do when an error occurs... log the exception, etc.
    }
}

...

Class Calculate
{
    public static double DivideNumbers(int num1, int num2)
    {
        result = (double)num1/num2;
        return result;

        // There's no need to catch an exception here if you're ONLY going to re-throw it.
    }        
}