![](/img/trans.png)
[英]What is the difference between try-catch and throws Exception in terms of performance?
[英]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 block
是unreachable code
。 通常,應該首先具有catch塊以獲取更具體的異常,然后是廣義異常。 現在,在您的情況下,第2個catch塊應該處理的所有異常都將在第一個中處理。
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.