如何正确使用try-catch语句

时间:2013-03-08 15:07:58

标签: c# exception exception-handling try-catch

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

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

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,哪里多余?

6 个答案:

答案 0 :(得分:7)

一般情况下,如果您可以在catch中执行某些操作,则应该只使用try-catch。您可以重试失败的连接或以其他方式帮助用户继续吗?你想记录异常吗?

如果你无法恢复或优雅地降级,那么抓住异常是没有意义的。只需让它冒泡到应用程序顶部的一个catch(例如,在Web应用程序基页的Page_Error事件中)并在那里处理UI。

答案 1 :(得分: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
    // ...
}

答案 2 :(得分:1)

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

答案 3 :(得分:1)

经验法则是你只能抓住你将要做的事情。例如,记录特定异常或重试呼叫。

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

答案 4 :(得分:1)

通常,当您需要通过某些语句执行来处理错误原因时,应该使用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时间并不像看起来那么简单。

请阅读这篇文章(我个人从中学到了很多东西):Exception Handling Best Practices in .NET

答案 5 :(得分:0)

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