我正在开发一个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
在我看来,第一个更好,原因如下:
使用第一种方法是否可以,或者使用第二种方法有什么好处?
答案 0 :(得分:4)
使用例外
表示调用者违反了调用该函数的前提条件。这通常会导致程序中的修复,因为调用者有责任确保满足前提条件。
表示尽管满足调用函数的前提条件,但函数无法确保后置条件。这应该由来电者优雅地处理。
我认为像isFBConnected
这样的函数应检查facebook是否已连接。有两个完全有效的答案:是,否。如果函数无法确定Facebook是否已连接,则应抛出异常。
答案 1 :(得分:3)
在正常程序流程中使用try / catch块会导致性能下降。最好在第一个例子中使用if / then语句。
Effective Java中提到了这一点。顾名思义,例外仅用于特殊情况;它们永远不应该用于普通的控制流程。
答案 2 :(得分:2)
同意劳尔的回答。我想补充说,当您开发其他库(如库或sdk)使用的代码时,异常非常有用。显式异常提供了有用的反馈,可以节省大量的调试时间,特别是如果他们无法访问源代码。
例如,如果你在Android中开发一个特殊的Layout
,需要exaclty to childviews才能工作,那么你可以抛出一个异常,说“需要两个孩子”,这样用户就不会遇到加密崩溃问题。知道该怎么做。
答案 3 :(得分:1)
对我来说第一种方法没问题,因为除了捕捉它之外你没有做任何异常的事情
答案 4 :(得分:1)
生成,抛出和捕获异常会产生性能开销。当然,在可能经常执行的低级代码中,您不希望为标准操作生成和捕获大量不必要的异常。