首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将insertion插入MongoDB

将insertion插入MongoDB
EN

Code Review用户
提问于 2016-02-20 13:13:56
回答 2查看 218关注 0票数 2

在我的代码中,有一个函数链调用,其中最深的函数可能抛出异常。我根据业务逻辑来抓和处理它。问题是调用链中的所有其他函数都依赖于这个函数,因此,如果最深的函数返回null,所有其他函数都将抛出NullPointerException

我的问题是,从代码风格/可维护性/最佳实践的角度来看,我是否可以只关心最深的调用链级别的异常,以及在链中所有更高的函数中使用类似于catch (NullPointerException ignored) {}的东西?

在一个ignored表达式中使用try-catch是一个好主意,还是我真的应该对所有捕获进行寻址,即使它们只是执行另一个函数的结果,在其中我要进行正确的异常处理?

代码片段:

代码语言:javascript
复制
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()中处理它?

EN

回答 2

Code Review用户

发布于 2016-02-20 17:33:30

不,那不是一个好的设计。捕捉NullPointerException几乎从来都不是正确的做法。实际上忽视它更糟。以这种方式使用它可以隐藏可能的编程错误。

jsonBuilder()应该向fetchPushDriver()抛出一个已知的、检查过的异常,后者应该处理异常、重新抛出它,或者将其包装到一个新的异常中并抛出。

票数 3
EN

Code Review用户

发布于 2016-02-20 18:20:03

如果要保持原来的方法JSONObject::jsonBuilder,那么应该记录null值是预期的返回类型这一事实。因为null是一种记录在案的可能性,所以您不应该继续使用它,应该先进行空检查。我也同意埃里克·斯坦因的观点,捕获NullPointerException可能掩盖其他程序员的错误:

代码语言:javascript
复制
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可能不会被发现。

然而,这篇文章并不是说已经有异常在内部处理的情况。在您的场景中,让异常被抛出更有意义。

代码语言:javascript
复制
public static JSONObject jsonBuilder(final String xmlDataSource) throws JSONException {
    return XML.toJSONObject(xmlDataSource);
}

然后,当您从fetchPushData调用方法时,您可以选择处理异常(通过选择另一个操作,或者抛出一个新的异常),或者只是让异常冒泡起来。

代码语言:javascript
复制
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);
} 
票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/120615

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档