在catch区块返回?

时间:2010-04-22 10:46:23

标签: c# .net exception-handling

在catch块中有一个return语句是错误的吗? 有哪些替代方案?
即:

public bool SomeFunction()
{
    try
    {
        //somecode
        return true;
    }
    catch(Exception ex)
    {
        MessageBox.Show(ex.message);
        return false;
    }

}

10 个答案:

答案 0 :(得分:36)

您可以从catch块正常返回。 这通常是很好的功能代码。

答案 1 :(得分:19)

一种替代方法是将返回值存储在临时变量中:

public bool SomeFunction()
{
    bool success = true;
    try
    {
        //somecode
    }
    catch(Exception ex)
    {
        MessageBox.Show(ex.message);
        success = false;
    }

    return success;
}

但就个人而言,我发现你编写它的方式(带有一个catch-all catch语句)更具可读性。另一方面,如果您期望一个特定的异常,并且您可能有多个路径可以返回成功...

try
{
    DoTheImportantThing();
    DoTheOtherThingThatMightFailButWeDontCare();
}
catch (DontCareAboutItException ex)
{
    log.Info(ex);
}
catch (Exception ex)
{
    log.Error(ex);
    return false;
}

return true;

然后在我看来,你最好尽可能地将回复陈述推到尽头。

作为旁注,根据应用程序的不同,请考虑记录您捕获的异常,而不是仅仅向用户显示它们。记录的异常比用户重述发生的事情要可靠得多。

答案 2 :(得分:11)

如果在try块中已经有一个return语句,我可能会把另一个返回放在函数的末尾:

try
{
    //somecode
    return true;
}
catch(Exception ex)
{
    MessageBox.Show(ex.message);
}
return false;

这是为了避免多次返回,如果需要处理多个异常。

答案 3 :(得分:8)

没关系,请记住,一些代码可能在返回指令后执行(返回值ll被兑现)。

    try
    {
        return;
    }
    catch(Exception ex)
    {
        return;
    }
    finally
    {
        //some code
    }

答案 4 :(得分:7)

public bool SomeFunction()
{
    try
    {
        //somecode
        return true;
    }
    catch(Exception ex)
    {
        MessageBox.Show(ex.message);
    }
    return false;
}

我个人将return语句放在方法的底部而不是catch块中。但两者都很好。这完全取决于组织中的可读性(主观)和指导原则。

答案 5 :(得分:2)

没错,但是如果你使用了资源,通常最后使用block来关闭它,而不是两次调用close方法。在这种情况下,您可以选择在finally块之后使用return语句。

答案 6 :(得分:2)

是的,这是完全正常的。

不要忘记,您还可以在返回后使用 finally 块执行。

答案 7 :(得分:0)

对于一个在成功时返回true而在失败时返回false的函数对我来说是完全合理的。我希望它没有任何问题 - 我一直这样做:)

答案 8 :(得分:0)

catch块的主要目的是提供一个可以在try块中发生异常情况的地方。所以你抓住了一个异常,继续它......并从一个方法返回。如果调用者方法不关心异常,这是绝对正常的。

答案 9 :(得分:0)

您可以在catch块中添加return。您明确知道您的代码将返回并继续执行,而不是在catch块停止。

try{
    //do something
}
catch{
    //error handling
    return;
}

代替在代码中使用大量的try-catch块会导致混乱并且只会导致代码混乱,它可以更好地处理你的noe try catch中的所有内容,并检查返回的错误是什么。

try{
    //do something
}
catch (Exception as err){
    if (err == "IOException"){
         //handle exception
    else if (err.indexOf("TypeError"){
         //handle exception
    }
}

这两种方法可以检查异常的类型,以便您可以相应地显示消息。如果您愿意,也可以捕获特定的例外,而不是Exception as err您可以catch IOException, ...