自从我上一次编程练习以来已经有一段时间了,所以这是一个相当基本的问题。但是我找不到任何具体的答案。
假设我已经定义了一个可能导致异常的方法。该方法看起来像这样(在伪代码中):
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,哪里多余?
答案 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 Password
,Invalid 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。
希望它有所帮助......