使用Try Catch异常处理或显式检查

3

我正在开发一款安卓服务,并遇到两种不同的编写代码来处理验证的方法。

第一种方法:使用布尔值或明确检查。在这种方法中,我返回从函数获取到的任何值。返回的值可以是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

第二种风格: 使用异常处理。在这里,如果会话关闭(无效)或位置为空,我从实用方法中抛出自定义异常。并按以下方式处理:

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个回答

4

使用异常来:

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

  • 表明即使满足调用该函数的前提条件,函数仍无法确保后置条件。调用者应该优雅地处理这种情况。

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


3

2

同意Raúl的答案。我想补充说,当你开发代码供其他人使用,比如库或SDK时,异常非常有用。显式异常提供了有用的反馈信息,可以节省很多调试时间,特别是如果他们没有访问源代码的权限。

例如,如果你在Android中开发一个需要正好两个子视图才能工作的特殊Layout,那么你可以抛出一个异常,说“需要正好两个子元素”,这样用户就不会遭遇晦涩的崩溃,并知道该怎么做。


1

在我看来,第一种方法是可以的,因为除了捕获异常之外,你并没有做任何真正的异常处理。


1
在生成、抛出和捕获异常时会产生性能开销。特别是在可能频繁执行的低级代码中,您不希望为标准操作生成和捕获大量不必要的异常。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接