簡體   English   中英

嘗試處理異常時對 catch 塊進行排序

[英]Order catch blocks when try to handle an exception

try
{
    // throws IOException
}
catch(Exception e)
{
}
catch(IOException e)
{
}

try塊拋出IOException ,它將調用第一個catch塊,而不是第二個。 誰能解釋一下? 為什么它調用第一個catch塊?

來自try-catch(C# 參考)

在同一個 try-catch 語句中可以使用多個特定的 catch 子句。 在這種情況下,catch 子句的順序很重要,因為 catch 子句是按順序檢查的。 在不太具體的異常之前捕獲更具體的異常。 如果您對 catch 塊進行排序以便永遠無法到達后面的塊,則編譯器會產生錯誤。

你應該使用

try
{
    // throws IOException
}
catch(IOException e)
{
}
catch(Exception e)
{
}

請注意, Exception類是所有異常的基類。

異常類是所有異常的基類。 因此,無論何時拋出任何類型的異常,它都會首先被第一個可以捕獲任何類型的異常的 catch 塊捕獲。

所以嘗試在Exception之前使用IOCException

您可以在此處查看 IOCException 的層次結構

它們按您指定的順序捕獲。 在您的情況下,您應該將IOException放在Exception之上。 始終將Exception作為最后。

原因是IOException派生自Exception ,所以IOException實際上一個Exception (" is-a "),因此第一個catch處理程序匹配並被輸入。

IOException 繼承自 Exception。 所有異常都可以。 當您首先捕獲 Exception 時,您將捕獲所有異常(包括 IOException)。 確保您的 catch(Exception e) 是列表中的最后一個捕獲,否則所有其他異常處理將被有效地忽略。

暫無
暫無

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

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