1

自从我上次编程练习以来已经有一段时间了,所以这是一个相当基本的问题。但是我还没有找到任何具体的答案。

假设我定义了一个可能导致异常的方法。该方法看起来像这样(相当伪代码):

public int Calculate(int x, int y) 
{
  try 
  {
    doSomeCalc();
  }
  catch (SomeException ex) 
  {
    doExceptionHandling();
  }

  return result;
}

现在如果应用程序的另一部分想要使用这个方法,它应该使用另一个 try-catch 块吗?

public MyMainApp() {
  try 
  {
    Calculate(1, 2);
  } 
  catch (SomeException ex) 
  {
    doExceptionHandling();
  }
}

所以这里的问题是我应该在哪里使用 try-catch 以及它在哪里是多余的?

4

6 回答 6

8

通常,只有在 catch 中有可以做的事情时,才应该使用 try-catch。您能否重试失败的连接或以其他方式帮助用户继续?是否要记录异常?

如果您无法恢复或正常降级,那么捕获异常是没有意义的。只需让它冒泡到应用程序顶部的某个位置(例如,在 Web 应用程序的基本页面中的 Page_Error 事件中)并在那里处理 UI。

于 2013-03-08T15:11:05.250 回答
2

一般来说,当你需要处理某些语句执行引起的错误时,应该使用try-catch。

例如,在 Db 连接的情况下,SqlException会引发可能包含与错误相关的信息,例如Wrong PasswordInvalid Database...

try
{
    //try connect to db
}
catch (SqlException ex)
{
    // information of database related exception
}
catch (Exception ex)
{
    // catch any other error
}

Exception Handling时间并不像看起来那么简单。

请阅读这篇文章(我个人从中学到了很多):.NET 中的异常处理最佳实践

于 2013-03-08T15:11:27.527 回答
2

如果Calculate已经捕获异常并处理它,为什么还要MyMainApp关心它呢?如果它没有抓住它,MyMainApp可能想要处理它。如果它没有以有用的方式处理它(至少记录异常),它不应该捕获它。

最佳实践是尽快抛出有意义的异常,例如(假设负值会导致错误的结果或异常):

public int Calculate(int x, int y)
{
    if (x <= 0)
        throw new ArgumentException("X has to be positive", "x");
    if (y <= 0)
        throw new ArgumentException("Y has to be positive", "y");

    // now the calculation should be safe without any side-effects
    // ...
}
于 2013-03-08T15:15:03.360 回答
1

这取决于SomeException类型。如果它是所有异常的基类,则不,在您的第二个块中不需要它。但是,如果它只处理一种特定类型的异常并且可能发生其他异常,则需要第二个块。为什么只需要处理一个特定的异常?如果需要,您可以自行查找 :)

于 2013-03-08T15:10:16.957 回答
1

经验法则是,你只捕捉到你将要做什么的地方,除了例外。例如,记录特定异常或重试调用。

为了维护堆栈跟踪,您通常使用重新抛出异常throw;,然后在全局处理错误的进程顶部有一些机制。

于 2013-03-08T15:10:23.757 回答
0

尝试将 try 和 catch 放入其中,event functions因为只会从事件函数调用普通函数。如果rollbacks要执行某些函数,则仅在其他层函数中使用 try。希望能帮助到你....

于 2013-03-08T15:10:15.593 回答