使用Try Catch Exception处理或显式检查

时间:2013-10-24 13:29:54

标签: java android exception-handling

我正在开发一个Android服务并遇到两种不同的样式来编写代码来处理验证。

第一个样式:使用布尔或显式检查。在这个方法中,我返回从函数中获得的任何值。返回值可以为null,Closed(无效)。

boolean fbConnected = appPrefences.isFBConnected();
if (!fbConnected)
{
    ShowNotification("FB not connected");
    stopSelf();
    return;
}

Session session = GetSession();
if (session.isClosed())
{
    ShowNotification("Session not valid");
    stopSelf();
    return;
}

Coordinates result = getLocation();
if(result == null)
{
    ShowNotification("Could not get location");
    stopSelf();
    return;
}

//  Do something finally with Session, FB and location

第二个样式:使用异常处理。在这里,如果会话关闭(无效)或者位置为null,我会从实用程序方法中抛出自己的自定义异常。我按如下方式处理:

try
{
    appPrefences.connectToFb();
    Session session = GetSession();
    Coordinates result = getLocation();
}
catch(FBException e)
{
    ShowNotification("FB not connected");
    stopSelf();
    return;
}
catch(SessionException e)
{
    ShowNotification("Session not valid");
    stopSelf();
    return;
}
catch(LocationException e)
{
    ShowNotification("Could not get location");
    stopSelf();
    return;

}

//  Do something finally with Session, FB and location

在我看来,第一个更好,原因如下:

  • 在第二种方法中,抛出异常会导致性能下降。

使用第一种方法是否可以,或者使用第二种方法有什么好处?

5 个答案:

答案 0 :(得分:4)

使用例外

  • 表示调用者违反了调用该函数的前提条件。这通常会导致程序中的修复,因为调用者有责任确保满足前提条件。

  • 表示尽管满足调用函数的前提条件,但函数无法确保后置条件。这应该由来电者优雅地处理。

我认为像isFBConnected这样的函数应检查facebook是否已连接。有两个完全有效的答案:是,否。如果函数无法确定Facebook是否已连接,则应抛出异常。

答案 1 :(得分:3)

在正常程序流程中使用try / catch块会导致性能下降。最好在第一个例子中使用if / then语句。

https://softwareengineering.stackexchange.com/questions/189222/are-exceptions-as-control-flow-considered-a-serious-antipattern-if-so-why

Effective Java中提到了这一点。顾名思义,例外仅用于特殊情况;它们永远不应该用于普通的控制流程。

答案 2 :(得分:2)

同意劳尔的回答。我想补充说,当您开发其他库(如库或sdk)使用的代码时,异常非常有用。显式异常提供了有用的反馈,可以节省大量的调试时间,特别是如果他们无法访问源代码。

例如,如果你在Android中开发一个特殊的Layout,需要exaclty to childviews才能工作,那么你可以抛出一个异常,说“需要两个孩子”,这样用户就不会遇到加密崩溃问题。知道该怎么做。

答案 3 :(得分:1)

对我来说第一种方法没问题,因为除了捕捉它之外你没有做任何异常的事情

答案 4 :(得分:1)

生成,抛出和捕获异常会产生性能开销。当然,在可能经常执行的低级代码中,您不希望为标准操作生成和捕获大量不必要的异常。