簡體   English   中英

以下try-catch語句有什么區別?

[英]What is the difference between the following try-catch statements?

這些try-catch塊用法和何時應使用每個塊有什么區別?

try {
  doSomething1();
} catch(Exception e1){
  exception_handle1();
}
try {
  doSomething2();
} catch(Exception e2){
  exception_handle2();
}

try {
  doSomething1();
  doSomething2();
} catch(Exception e1) {
  exception_handle1();
} catch(Exception e2) {
  exception_handle2();
}

try {
  doSomething1();
  try {
    doSomething2();
  } catch(Exception e2){
    exception_handle2();
  }
} catch(Exception e1){
  exception_handle1();
}
try {
  doSomthing1()
catch(Exception e1){
  exception_handle1()
}
try {
  doSomthing2()
catch(Exception e2){
  exception_handle2()
}

doSomthing1()doSomthing2()是不相關的方法。 它們之一的故障彼此獨立。

try {
  doSomthing1()
  doSomthing2()
catch(Exception e1){
  exception_handle1()
}catch(Exception e2){
  exception_handle2()
}

如果doSomthing1()失敗,我們可以使用try-catch塊停止doSomthing2()方法的執行。 我們可以使用兩個catch塊分別處理每個異常。 但是,需要注意的重要一點是,您的2nd catch blockunreachable code 通常,應該首先具有catch塊以獲取更具體的異常,然后是廣義異常。 現在,在您的情況下,第2個c​​atch塊應該處理的所有異常都將在第一個中處理。

try {
  doSomthing1()
  try {
    doSomthing2()
  catch(Exception e2){
    exception_handle2()
  }
}
catch(Exception e1){
  exception_handle1()
}

我們有2個try-catch塊相互嵌入。 即使在doSomthing2()失敗之后,該程序仍將在try塊內繼續。

好吧,第一個和另外兩個之間的明顯區別是,無論doSomthing1是否引發異常, doSomthing2將嘗試doSomthing1 在您引用的確切代碼中,除了第三個示例之外,第二個和第三個示例之間沒有很大區別(除了語法錯誤),第二次try的異常處理代碼在第一個示例的異常處理代碼之 ,因此如果拋出該異常,該異常將被捕獲。

您應該使用哪種完全取決於情況。 有時,它是適合運行doSomthing2是否doSomthing1拋出異常。 有時候不是。

如果doSomThing1失敗,則代碼繼續執行doSomthing2

在第二個示例中,如果doSomthing1失敗,則不會執行doSomthing2

而第三個示例與第二個示例相似。

創建條件語句時的概念相同,只是條件語句正在測試條件,而try catch正在測試錯誤

首先讓我們假設doSomething1()和exceltion_handle1()不要調用System.exit(x)之類的東西。

1)因此,第一段代碼將執行doSomething1(),無論doSomething1()是否拋出任何異常,它都將對其進行處理(處理catch代碼塊),並進行第二次嘗試並以相同的方式運行它。

try {
  doSomething1();
} catch(Exception e1){
  exception_handle1();
}
try {
  doSomething2();
} catch(Exception e2){
  exception_handle2();
}

今天是早上,所以我希望我不會做任何錯誤的決定。

2)此代碼將先運行doSomething1()然后再運行doSomething2(),無論哪個失敗(拋出異常),都將僅調用第一個catch子句,因為它吸收了所有子類及其本身,因此不會捕獲第二個catch達到(首先接受所有可能的異常)。 所以afaik,您應該會得到一個錯誤(不應編譯)。 它很聰明,並且會認識到,絕不會以任何方式達到第二個目標。

正確的模式是:當我們深入探究時,例外應該越來越廣泛(嚴格)。 這是合乎邏輯的,因為catch子句的順序降低了,上部catch不應成為底部子句的父級,因為ANYWAY父級都會接受該異常,並且不會到達底部的子級。

Example: (I recommend you to learn about Multicatch in java.)
catch (Specific2ChildOfSpecific1 e3)
...
catch (specific1ChildOfException e2)
...
catch (Exception e1)


try {
  doSomething1();
  doSomething2();
} catch(Exception e1) {
  exception_handle1();
} catch(Exception e2) {
  exception_handle2();
}

3)這一個:如果doSomething1()將失敗,則將執行e1 catch子句,僅此而已,如果它將通過,則如果doSomething2()將運行,並且如果失敗,則將執行e2 catch子句。

請注意第二個示例,無論哪個doSomething失敗,都將執行e1(不要忘記出現錯誤,因為第二個錯誤無法到達)。 但我知道您想問什么。

try {
  doSomething1();
  try {
    doSomething2();
  } catch(Exception e2){
    exception_handle2();
  }
} catch(Exception e1){
  exception_handle1();
}

暫無
暫無

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

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