试试;抓住结构基本问题

时间:2011-02-28 11:22:51

标签: c# .net exception-handling coding-style try-catch

我是编程新手并且想问一下,下面显示的代码是一种在布尔方法中使用try catch的好方法吗?

它只是示例代码,但我在Presenter类中有很多方法,并且想知道我将catch放回false的方式,这样做可以,或者我还能如何改进这个

public bool TestMethod()
{
    try
    {
       if(true)
       { 
         //some random code
         return true;
       }
       else{return false;}
    }
    catch{return false;}
}

我只是想确定这是实现这一目标的好方法,我将不胜感激任何有关如何改进的反馈。

7 个答案:

答案 0 :(得分:4)

不要以这种方式使用全能。捕获所有异常对于顶级异常处理程序是可接受的。但它不应该吞下它们。但是记录它们可能会显示错误。

对于您的代码,您应该只捕获您期望的特定异常类型。而且我不确定在你的例子中,例外是否是一个好主意。

答案 1 :(得分:3)

以下是一些要点,我对这个问题中的代码有点辨别:

代码中的各个地方有多个return语句,这可能会让代码的读者感到困惑。我们通常倾向于在函数中遵循单个return语句。 (尽管规则有一些例外,例如在出现某些错误情况时提前返回)

一般情况下,你永远不应该向用户隐藏异常(或者有人说“永远不会吞下异常”),你应该重新抛出它或处理异常并将其显示给用户。

至少应该有一些异常日志。

因此,考虑到这些要点,上述代码可以写成:

public bool TestMethod()
{
    bool returnValue = false;
    try
    {
       if(true)
       { 
         //some random code
         returnValue = true;
       }       
    }
    catch(Exception ex)
    {
         // log the exception here, or rethrow it
    }

    return returnValue;
}

答案 2 :(得分:2)

恕我直言,它不是catch-block返回值的目的。我会这样用它:


public bool TestMethod()
{
    bool retVal = false;
    try
    {
        if (true)
        {
            //some random code
            retVal = true;
        }
        else{}
    }
    catch{}
    return retVal;
}

答案 3 :(得分:1)

答案 4 :(得分:1)

这取决于你在if块中做了什么。如果您在意外错误时返回false,您将永远无法知道出了什么问题。如果您的代码足够简单并且您知道出了什么问题,那么这是一个很好的用法。

例如,对于检查给定字符串是否为有效数字且乘数为5的方法来说,这是一种很好的方法。如果它不是数字,您将获得异常,并且您不需要记录它或其他任何东西都不会导致异常。

答案 5 :(得分:1)

这里的要点是可读性,每个人都有自己的风格(这不是对与错的问题)。我所做的是声明一个返回值(正如有些人在这里做的那样retValreturnValue,...),我最喜欢的是result,在你的情况下应该是{{1} }}

然后在方法体中使用此bool变量,即在result内,不要返回任何内容,除非在返回try/catch的方法结束时。个人使用result,其中不应运行剩余代码(return之后)。

这样读者就不会混淆这么多return。您可能会考虑早期return的性能优势,我怀疑(如果编译器优化不能为您做到这一点)它对returnsframeworks的世界有一点影响,我们在那里每天牺牲设计问题的性能。

最后,请认真对待layers。如果您不知道异常原因并且不会以优雅的方式处理它,请将其丢弃。 CodeInChaos不是坏事,它们就像医学上的痛苦。一个失去了脚痛的慢性糖尿病患者,不会注意到他的脚受轻伤,google search你是否会因为忽略痛苦的信号而失明。

答案 6 :(得分:0)

直接从catch子句内部返回肯定是可以的,如果这就是你所要求的。否则编译器会禁止它;例如,您无法从finally子句中返回。

但是,在您的特定代码示例中,catch子句似乎毫无意义,因为try中的代码不会抛出任何异常(除了{{1}之类的系统级异常但是,无论如何,这都是......特殊的)。如果其中有OutOfMemoryException语句,或者您认为可能抛出的方法调用(例如,throw可能抛出File.Open),则会更有意义。

关于代码风格,我建议你多使用缩进:

FileNotFoundException