C#try catch继续执行

gar*_*lur 15 c# try-catch

我有一个看似相当简单的问题(当然,如果你知道答案).

我调用了另一个函数的某个函数但是我想继续从调用者执行,即使被调用者抛出异常.让我给你举个例子:

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}
}
Run Code Online (Sandbox Code Playgroud)

编辑:function1也有一个return语句,所以事实上没有任何东西可以崩溃

在function2中我需要做的事情,但我只需要记录是否有任何失败,例如:

int function2()
{
    try
    {
        //dostuff
    }
    catch(Exception e)
    {
        //Log stuff to db
    }
}
Run Code Online (Sandbox Code Playgroud)

好的,现在我的问题是,如果我想在function1中继续执行,即使函数2抛出错误,我该怎么办?

如果我应该扔掉,有时我会混淆; 或扔e; 或者什么都不扔(留下挡块空)

Phi*_*idt 17

将catch块留空应该可以解决问题.不过,这几乎总是一个坏主意.一方面,性能损失,另一方面(这更重要),你总是想知道何时出现错误.

我猜想在你的情况下,"被调用者"功能失败实际上不一定是"错误",可以这么说.也就是说,它有望为它有时会失败.如果是这种情况,几乎总是有一种比使用异常更好的方法来处理它.

还有,如果你能原谅这个双关语,例外的"规则",虽然.例如,如果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;
    }
}
Run Code Online (Sandbox Code Playgroud)

这样,既然你使用了一个可以为空的返回类型,那么返回null不会对你造成伤害.


Yan*_*nis 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

}
Run Code Online (Sandbox Code Playgroud)

修改后的编辑:

你可以做:

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

        }
Run Code Online (Sandbox Code Playgroud)


Jay*_*Jay 6

或者您可以将循环逻辑本身封装在 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; }    

}
Run Code Online (Sandbox Code Playgroud)

或者...

try{ 
    for(int i = function2(); ; ;) {
        try { i = function2(); return; } 
        finally { /*decide to break or not :P*/continue; } }
} catch { /*failed on first try*/ } finally{ /*afterwardz*/ }
Run Code Online (Sandbox Code Playgroud)