我有一个看似相当简单的问题(当然,如果你知道答案的话)。
我调用了另一个函数的某个函数但是我想继续从调用者执行,即使被调用者抛出异常。让我举个例子:
something function1()
{
try
{
//some code
int idNumber = function2();
//other code that need to execute even if function2 fails
return something;
}
catch(Exception e)
{//... perhaps something here}
}
编辑:function1也有一个return语句,所以事实上没有任何东西可以崩溃
在function2中我需要做的事情,但我只需要记录是否有任何失败,例如:
int function2()
{
try
{
//dostuff
}
catch(Exception e)
{
//Log stuff to db
}
}
好的,现在我的问题是,如果我想在function1中继续执行,即使函数2引发错误,我该怎么办?
有时我会混淆,如果我应该扔;或扔e;或者什么都不扔(留下挡块空)
答案 0 :(得分:17)
将catch块留空应该可以解决问题。不过,这几乎总是一个坏主意。一方面,性能损失,另一方面(这更重要),你总是想知道何时出现错误。
我猜想“callee”功能失败,在你的情况下,实际上不一定是“错误”,可以这么说。也就是说,期望它有时会失败。如果是这种情况,几乎总有一种更好的方法来处理它而不是使用异常。
,如果您将原谅双关语, 例外 加入“规则”。例如,如果function2调用的是一个Web服务,其结果对于您的页面来说并不是必需的,那么这种模式可能没问题。虽然,在几乎100%的情况下,你至少应该将它记录在某个地方。在这种情况下,我会将其记录在finally
块中,并报告服务是否返回。请记住,现在可能对您没有价值的数据可以在以后变得有价值!
上次编辑(可能):
在评论中我建议你将try / catch 放在 function2中。只是想我会详细说明。 Function2看起来像这样:
public Something? function2()
{
try
{
//all of your function goes here
return anActualObjectOfTypeSomething;
}
catch(Exception ex)
{
//logging goes here
return null;
}
}
这样,既然你使用了一个可以为空的返回类型,那么返回null并不会对你造成伤害。
答案 1 :(得分:8)
为什么你不能使用finally块?
喜欢
try {
} catch (Exception e) {
// THIS WILL EXECUTE IF THERE IS AN EXCEPTION IS THROWN IN THE TRY block
} finally {
// THIS WILL EXECUTE IRRESPECTIVE OF WHETHER AN EXCEPTION IS THROWN WITHIN THE TRY CATCH OR NOT
}
修改后的编辑:
你可以这样做:
int? returnFromFunction2 = null;
try {
returnFromFunction2 = function2();
return returnFromFunction2.value;
} catch (Exception e) {
// THIS WILL EXECUTE IF THERE IS AN EXCEPTION IS THROWN IN THE TRY block
} finally {
if (returnFromFunction2.HasValue) { // do something with value }
// THIS WILL EXECUTE IRRESPECTIVE OF WHETHER AN EXCEPTION IS THROWN WITHIN THE TRY CATCH OR NOT
}
答案 2 :(得分:3)
或者您可以将循环逻辑本身封装在try catch中,例如
for(int i = function2(); i < 100 /*where 100 is the end or another function call to get the end*/; i = function2()){
try{
//ToDo
}
catch { continue; }
}
或者...
try{
for(int i = function2(); ; ;) {
try { i = function2(); return; }
finally { /*decide to break or not :P*/continue; } }
} catch { /*failed on first try*/ } finally{ /*afterwardz*/ }
答案 3 :(得分:1)
就这样做
try
{
//some code
try
{
int idNumber = function2();
}
finally
{
do stuff here....
}
}
catch(Exception e)
{//... perhaps something here}
对于所有意图和目的,finally块将始终执行。现在有一些例外,它们实际上不会执行:任务杀死程序,并且存在快速失败的安全异常,它会立即杀死应用程序。除此之外,函数2中将抛出异常,finally块将执行所需的代码,然后在外部catch块中捕获异常。
答案 4 :(得分:0)
你的意思是你想在function1中执行代码而不管function2是否抛出异常?你看过finally块了吗? http://msdn.microsoft.com/en-us/library/zwc8s4fz.aspx
答案 5 :(得分:0)
在你的第二个函数中,删除catch块中的e变量,然后添加throw。
这会将生成的异常延续到最终函数并输出。
当你不希望你的业务逻辑代码抛出异常而你的UI时,它很常见。