在我的代码中,有一个函数链调用,其中最深的函数可能抛出异常。我根据业务逻辑来抓和处理它。问题是调用链中的所有其他函数都依赖于这个函数,因此,如果最深的函数返回null,所有其他函数都将抛出NullPointerException。
我的问题是,从代码风格/可维护性/最佳实践的角度来看,我是否可以只关心最深的调用链级别的异常,以及在链中所有更高的函数中使用类似于catch (NullPointerException ignored) {}的东西?
在一个ignored表达式中使用try-catch是一个好主意,还是我真的应该对所有捕获进行寻址,即使它们只是执行另一个函数的结果,在其中我要进行正确的异常处理?
代码片段:
public static JSONObject jsonBuilder(String xmlDataSource) {
JSONObject xmlJSONObj = null;
try {
xmlJSONObj = XML.toJSONObject(xmlDataSource);
} catch (JSONException e) {
e.printStackTrace();
}
return xmlJSONObj;
}
public static void fetchPushData(DBDriver drv, MongoCollection<Document> dbColl, TrackedEpisode episode) {
String xmlFeed = JsonHandler.xmlDataLoader(episode.getUrlRSS());
try {
JSONObject xmlJSONObj = JsonHandler.jsonBuilder(xmlFeed);
JsonHandler.docBuilderEvent(xmlJSONObj, episode.getEpisodeID());
JSONArray itemsArr = JsonHandler.getItemsArr(xmlJSONObj);
episode.setEpisodeLastUpdate(getLatestPubDate(itemsArr));
drv.insertToDB(dbColl, itemsArr);
} catch (NullPointerException ignored) {}
}这里我们可以看到,在失败的情况下,jsonBuilder()抛出异常,我将处理该异常并返回null。现在,docBuilderEvent()还将在xmlJSONObj中由于null抛出NullPointerException。我应该关心这个NullPointerException,还是只在jsonBuilder()中处理它?
发布于 2016-02-20 17:33:30
不,那不是一个好的设计。捕捉NullPointerException几乎从来都不是正确的做法。实际上忽视它更糟。以这种方式使用它可以隐藏可能的编程错误。
jsonBuilder()应该向fetchPushDriver()抛出一个已知的、检查过的异常,后者应该处理异常、重新抛出它,或者将其包装到一个新的异常中并抛出。
发布于 2016-02-20 18:20:03
如果要保持原来的方法JSONObject::jsonBuilder,那么应该记录null值是预期的返回类型这一事实。因为null是一种记录在案的可能性,所以您不应该继续使用它,应该先进行空检查。我也同意埃里克·斯坦因的观点,捕获NullPointerException可能掩盖其他程序员的错误:
public static void fetchPushData(
final DBDriver drv,
final MongoCollection<Document> dbColl,
final TrackedEpisode episode ) {
final String xmlFeed = JsonHandler.xmlDataLoader(episode.getUrlRSS());
final JSONObject xmlJSONObj = JsonHandler.jsonBuilder(xmlFeed);
if (xmlJSONObj != null) {
JsonHandler.docBuilderEvent(xmlJSONObj, episode.getEpisodeID());
final JSONArray itemsArr = JsonHandler.getItemsArr(xmlJSONObj);
episode.setEpisodeLastUpdate(getLatestPubDate(itemsArr));
drv.insertToDB(dbColl, itemsArr);
}
}在某些情况下,它是可以返回为空:
如果您打算表示没有可用的数据,返回null通常是最好的方法。空对象意味着数据已经返回,而返回null则清楚地表明没有返回任何数据。此外,如果尝试访问对象中的成员,返回null将导致空异常,这对于突出显示错误代码非常有用--尝试访问nothing成员是没有意义的。访问空对象的成员不会失败,这意味着bug可能不会被发现。
然而,这篇文章并不是说已经有异常在内部处理的情况。在您的场景中,让异常被抛出更有意义。
public static JSONObject jsonBuilder(final String xmlDataSource) throws JSONException {
return XML.toJSONObject(xmlDataSource);
}然后,当您从fetchPushData调用方法时,您可以选择处理异常(通过选择另一个操作,或者抛出一个新的异常),或者只是让异常冒泡起来。
public static void fetchPushData(
final DBDriver drv,
final MongoCollection<Document> dbColl,
final TrackedEpisode episode ) throws JSONException {
final String xmlFeed = JsonHandler.xmlDataLoader(episode.getUrlRSS());
final JSONObject xmlJSONObj = JsonHandler.jsonBuilder(xmlFeed);
JsonHandler.docBuilderEvent(xmlJSONObj, episode.getEpisodeID());
final JSONArray itemsArr = JsonHandler.getItemsArr(xmlJSONObj);
episode.setEpisodeLastUpdate(getLatestPubDate(itemsArr));
drv.insertToDB(dbColl, itemsArr);
} https://codereview.stackexchange.com/questions/120615
复制相似问题