【问题标题】:How should I handle an exception between two classes?我应该如何处理两个类之间的异常?
【发布时间】:2012-08-28 21:22:49
【问题描述】:

查看代码中的问题。

我有两节课。

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

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

【问题讨论】:

  • 类 DoSomething 是否应该被命名为 Calculate 并且方法 Calculate 被命名为 DevideNumbers?
  • 请澄清你的答案,将问题和代码分开。此外,您在 void 方法中返回一个 int。
  • 您通常希望调用者处理异常,除非计算方法实际处理异常。
  • @C.Evenhuis,对。但是调用者实际上是如何“捕捉”这个错误的呢?例如,我需要在消息框中显示错误消息。调用者如何从其他方法的 catch 块中获取错误消息?

标签: c# exception error-handling


【解决方案1】:

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

然后将对 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();
      }
    }
}

【讨论】:

  • 但是,如果我已经在方法中使用了 try catch,那岂不是太过分了?
  • 您还可以从内部方法返回 true 或 false 并检查该值以确定错误。这两种方式都可以正常工作。
  • @Testifier :您将能够从 DivideNumbers 中删除 try/catch,并让异常冒泡。除非你真的需要在内部方法中处理。
【解决方案2】:

删除你的 DevideNumbers 方法中的 try catch,我在那里没有用,因为你没有在 catch 中做任何事情。最好将您的 try catch 放在 btnProcessImages_Click 方法中,您可以在其中添加错误处理。

【讨论】:

  • 这几乎就是我一直在寻找的答案。 :) 谢谢欧文!
【解决方案3】:

你可以这样做:

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;
          }
    }
}

【讨论】:

    【解决方案4】:

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

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

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

    【讨论】:

      【解决方案5】:

      这是我的建议。请注意我更改的一些不太明显的内容。

      • DivideNumbers 返回一个double(你让它返回一个值,但该方法被标记为void
      • 我在DivideNumbers 中将一个int 转换为doubleint 除以 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.
          }        
      }
      

      【讨论】:

        猜你喜欢
        • 2021-04-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-01
        相关资源
        最近更新 更多