簡體   English   中英

Java Try Catch Block Size

[英]Java Try Catch Block Size

這可能是一個奇怪的問題,但我仍然認為我會要求深入了解這一點,並在編碼時阻止我做錯事。

假設我有一個函數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();
    }

}

最大的缺點是你也可能遇到一個你打算捕獲的異常。

例如,假設您有一個可能拋出NullPointerException的方法,並且您可以處理該情況。 (這樣的方法可能編寫得很糟糕,但是讓我們說它是一個庫方法,你不能改變它。)所以,你抓住了NPE:

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

}

try的正文中有兩個地方可以拋出NPE:來自func2 ,或者來自someString.equals如果someStringnull 此代碼以相同的方式處理,這可能是一個錯誤。

一般來說,在編程的幾乎所有方面(變量范圍,try-catch塊,類成員等),范圍越小,推理越容易,並且編寫錯誤的可能性越小。

顯然,您可以在方法的整個主體周圍使用try / catch塊,但將其限制在您期望出錯的區域會增加代碼的可讀性。 我也相當肯定它們非常慢,並且效率低下並且沒有必要'嘗試'沒有可能的IOException的東西,例如int i = 2 + 2;

我從編碼員的角度知道,如果拋出異常,他將能夠准確地知道異常的來源

你把它釘在那里:當你編寫一個方法時,你就可以在你和用戶之間創建一個契約。 如果聲明該方法拋出異常 - 用戶有責任捕獲並處理該異常。 如果它有意義 - 您應該這樣做(例如,如果您未能打開與DB的連接,則拋出異常)。 也就是說,在其他情況下,您可能希望預先形成一個回退,只是在操作成功與否時向用戶報告,在這種情況下,您可以使用try / catch包圍method2中的所有代碼並返回一個布爾值以保存您的用戶處理異常的額外編碼。

好吧,如果你在調用funct2之后在funct1中有任何東西,那么如果你把整個方法放在try-catch中就不會執行。

我引用清潔代碼書:

錯誤處理是一項工作,功能應該完成一項工作。 因此,處理錯誤的函數不應該做任何其他事情。 這意味着(如上例所示)如果關鍵字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;
  }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM