0

请参阅代码注释中的问题。

我有两节课。

这是主要课程(第 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() 向调用方法报告错误的最佳方式是什么?

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

4

5 回答 5

3

删除 try catchDivideNumbers并让异常冒泡。

然后将调用包装Calculate.DevideNumbers(2, 0);在 try catch 块中。

//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();
      }
    }
}
于 2012-08-28T21:26:11.880 回答
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;
          }
    }
}
于 2012-08-28T21:27:58.417 回答
1

删除您的 DevideNumbers 方法中的 try catch,我在那里没有用,因为您对 catch 中的任何内容都没有任何作用。最好将您的 try catch 放置在 btnProcessImages_Click 方法中,您可以在其中添加错误处理。

于 2012-08-28T21:29:48.140 回答
0

这是我的建议。请注意我更改的一些不是非常明显的事情。

  • DivideNumbers 返回一个double(你让它返回一个值,但该方法被标记为void.
  • 我投了一个到int一个doubleDivideNumbers一个int除以一个int总是一个int。这可能会产生意想不到的结果,除非您想要/期望隐式舍入。
  • 异常处理在不同的类中完成,因为这似乎是您想要处理它的地方。IE 如果您的唯一意图是重新抛出异常,那么捕获异常有什么意义?就让它冒泡吧。

...

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.
    }        
}
于 2012-08-28T21:38:39.413 回答
0

首先,您不应该添加一个try catch块,DevideNumbers因为根据您提供的代码,您对异常没有做任何事情。您只需要捕获异常以防您打算对其进行处理(例如记录错误)

无论如何,异常都会冒泡,所以你不需要那个try catch

在调用者方法上,您可以在调用时捕获任何异常DevideNumbers并发挥您的作用。

于 2012-08-28T21:30:15.040 回答