2013-03-08 97 views
1

自我上次编程练习已经有一段时间了,所以这里有一个相当基本的问题。但是我找不到任何具体的答案。如何正确使用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,它在哪里是多余的?

+1

这取决于。如果即使被调用的方法有异常,调用方法也可以接收结果。在这种情况下,您可能需要在每次返回结果时检查可能的异常问题,而这看起来像是额外的工作。在上面的例子中,我将在外部方法中使用try/catch,而不是在Calculate方法中。 – Quintium 2013-03-08 15:12:58

回答

7

一般来说,如果有什么可以做的话,你应该只使用try-catch。您可以重试失败的连接或以其他方式帮助用户继续吗?你想记录异常吗?

如果没有什么可以恢复或正常降级,捕捉异常没有意义。只要让它在应用程序的顶部(例如,在Web应用程序的基本页面中的Page_Error事件中)捕获并处理UI即可。

+1

我认为你的第一句话是全部答案的。 – 2013-03-08 15:22:27

0

尝试把尝试和抓住event functions里面,因为正常的功能只能从事件功能调用。只有在其他层功能尝试,如果一些rollbacks要执行。 希望它有帮助....

1

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

1

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

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

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

+0

非常感谢这篇文章。我确定要在接下来的日子里读它:-) – 2013-03-08 15:21:18

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 
    // ... 
}