我是编程新手并且想问一下,下面显示的代码是一种在布尔方法中使用try catch的好方法吗?
它只是示例代码,但我在Presenter类中有很多方法,并且想知道我将catch放回false的方式,这样做可以,或者我还能如何改进这个
public bool TestMethod()
{
try
{
if(true)
{
//some random code
return true;
}
else{return false;}
}
catch{return false;}
}
我只是想确定这是实现这一目标的好方法,我将不胜感激任何有关如何改进的反馈。
答案 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)
这里的要点是可读性,每个人都有自己的风格(这不是对与错的问题)。我所做的是声明一个返回值(正如有些人在这里做的那样retVal
,returnValue
,...),我最喜欢的是result
,在你的情况下应该是{{1} }}
然后在方法体中使用此bool
变量,即在result
内,不要返回任何内容,除非在返回try/catch
的方法结束时。个人使用result
,其中不应运行剩余代码(return
之后)。
这样读者就不会混淆这么多return
。您可能会考虑早期return
的性能优势,我怀疑(如果编译器优化不能为您做到这一点)它对returns
和frameworks
的世界有一点影响,我们在那里每天牺牲设计问题的性能。
最后,请认真对待layers
。如果您不知道异常原因并且不会以优雅的方式处理它,请将其丢弃。 CodeInChaos
不是坏事,它们就像医学上的痛苦。一个失去了脚痛的慢性糖尿病患者,不会注意到他的脚受轻伤,google search你是否会因为忽略痛苦的信号而失明。
答案 6 :(得分:0)
直接从catch
子句内部返回肯定是可以的,如果这就是你所要求的。否则编译器会禁止它;例如,您无法从finally
子句中返回。
但是,在您的特定代码示例中,catch
子句似乎毫无意义,因为try
中的代码不会抛出任何异常(除了{{1}之类的系统级异常但是,无论如何,这都是......特殊的)。如果其中有OutOfMemoryException
语句,或者您认为可能抛出的方法调用(例如,throw
可能抛出File.Open
),则会更有意义。
关于代码风格,我建议你多使用缩进:
FileNotFoundException