Java Try Catch Block Size

时间:2014-06-20 20:25:25

标签: java try-catch

这可能是一个奇怪的问题,但我仍然认为我会要求深入了解这一点,并在编码时阻止我做错事。

让我说我有一个函数func1(),在其中我调用函数func2()。 func2()抛出异常e1。我想在func1()中捕获这个异常。

因此,我是否在函数本身的开头启动try块并使用catch块在func1()结束时结束它,而不是仅仅围绕我调用函数func2的代码部分( )。

我从编码员的角度知道,如果抛出异常,他将能够准确地知道异常的来源。如果我们忽略这一点,那么将整个方法放在try-catch中是否还有其他不良影响?

编辑 - 代码片段

所以我将JSON字符串转换为JSON节点。此操作会引发异常。但是不是用try-catch块来包围这一个语句,而是将整个函数放在try块中。它对我来说看起来更干净。 :)

public void storePublicData(String publicData, String twitterId) {

    try {

        Date date=new Date();
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
        String day = formatter.format(date);

        BasicDBObject query = new BasicDBObject("date", day);
        query.append("brand_id", twitterId);

        JsonNode publicDataJsonNode;

        publicDataJsonNode = JSONOperations.castFromStringToJSONNode(publicData);


        DBObject document = BasicDBObjectBuilder.start()
                .add("brand_id", twitterId)
                .add("date", day)
                .add("followers", publicDataJsonNode.get("followersCount").asText())
                .add("tweets", publicDataJsonNode.get("tweetsCount").asText())
                .get();

        twitterCollection.update(query,new BasicDBObject("$set", document), true, false);

    } catch (JSONParamsException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

5 个答案:

答案 0 :(得分:3)

最大的缺点是你可能还会遇到没有打算抓住的例外。

例如,假设您有一个可能抛出NullPointerException的方法,您可以处理该情况。 (这种方法可能写得很糟糕,但让我们说它是一种图书馆方法而且你无法改变它。)所以,你抓住了NPE:

void func1() {
    try {
        func2();
        if (someString.equals("some value") {
            someOtherFunction();
        }
    } catch (NullPointerException e) {
        // handle func2()'s NPE somehow
    }

}

两个的地方,NPE可以在try的正文中投放:来自func2,或来自someString.equals if { {1}}是someString。此代码以相同的方式处理,这可能是一个错误。

一般来说,在编程的几乎所有方面(变量范围,try-catch块,类成员等),范围越小,推理越容易,并且编写错误的可能性越小。

答案 1 :(得分:2)

显然,您可以在方法的整个主体周围使用try / catch块,但将其限制在您期望出错的区域会增加代码的可读性。我也相当肯定他们很慢,而且效率低下,并且没有必要尝试“尝试”。例如,int i = 2 + 2;

中没有可能的IOException的东西

答案 2 :(得分:2)

  

我从编码员的角度知道,如果抛出异常,   他将能够准确地知道异常的来源

你把它钉在那里:当你编写一个方法时,你就可以在你和用户之间创建一个契约。如果声明该方法抛出异常 - 用户有责任捕获并处理该异常。如果它有意义 - 您应该这样做(例如,如果您未能打开与DB的连接,则抛出异常)。也就是说,在其他情况下,您可能希望预先形成一个回退,只是在操作成功与否时向用户报告,在这种情况下,您可以使用try / catch包围method2中的所有代码并返回一个布尔值以保存您的用户处理异常的额外编码。

答案 3 :(得分:0)

好吧,如果你在调用funct2之后在funct1中有任何内容,那么如果你将整个方法放在try-catch中,那就不会被执行。

答案 4 :(得分:0)

我引用清洁代码簿:

错误处理是一项工作,功能应该完成一项工作。 因此,处理错误的函数不应该做任何其他事情。这意味着(如上例所示)如果关键字try存在于函数中,它应该是函数中的第一个单词,并且 在catch / finally阻止之后应该没什么。

所以你应该创建一个管理异常的方法,如下所示:

public class Test {


  public void doSomthing(){

    // here i don't need to manage the exception because i have built parseDate(String date)
    Date date = parseDate("10-17-2016");

  }


  private Date parseDate(String date){
    Date result = null;
    try {
        result = new SimpleDateFormat().parse(date);//Throws Parse Exception
    } catch (ParseException e) {
        // Here you can:
        //1) Throws other exception (Checked or Unchecked)
        //2) Log the exception
        // I think you should not re-throws the exception because
        //is responsibility of this methods manage the exception
        e.printStackTrace();
    } 
    return result;
  }

}