3

我正在开发一个 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

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

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

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

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

使用第一种方法可以吗,还是使用第二种方法有一些真正的好处?

4

5 回答 5

4

使用例外

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

  • 表示尽管调用函数的先决条件已经满足,但函数不能保证后置条件。这应该由调用者优雅地处理。

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

于 2013-10-24T13:40:37.023 回答
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中提到。例外,顾名思义,仅用于例外情况;它们不应该用于普通的控制流。

于 2013-10-24T13:36:57.447 回答
2

同意劳尔的回答。我要补充一点,当您开发供其他库或 sdk 使用的代码时,异常很有用。显式异常提供有用的反馈,可以节省大量调试时间,尤其是在它们无法访问源代码的情况下。

例如,如果您Layout在 Android 中开发了一个特殊的应用程序,它需要对子视图进行精确操作,那么您可以抛出一个异常说“需要两个孩子”,这样用户就不会陷入神秘的崩溃并知道该怎么做。

于 2013-10-24T13:43:08.100 回答
1

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

于 2013-10-24T13:40:01.460 回答
1

在我看来,第一种方法是可以的,因为除了捕捉它之外,你没有做任何真正的异常明智的事情

于 2013-10-24T13:34:55.133 回答