簡體   English   中英

如果在 C# 中處理該異常期間引發另一個異常,是否有任何方法可以捕獲原始異常?

[英]is there any way to catch original exception if another exception raise during handeling that in C#?

假設我們在 C# 中有以下代碼和平:

try{
  ....
  try{

    throw new Exception1("exception1");

  }catch(Exception exception){

     ...
    throw new Exception2("exception2");

  }
}catch(Exception exception){
    ...
    log(exception.message);
}

是否可以在日志點(外部捕獲)中訪問異常 1 對象並記錄該對象?

以下是我認為您在談論的兩個合理示例。 它們說明了我在評論中試圖描述的內容以及@Jonesopolis 所描述的內容。

先說我的情況。 假設您正在編寫一個實用程序,它調用一些可能會拋出的較低級別的服務。 您可能希望以一種可能冒泡的異常對調用者更有意義的方式來描述實用程序的行為。 在這種情況下,我已經記錄了如果出現問題,我的實用程序將拋出ApplicationException

我從兩個地方這樣做,第一個是當我檢查一些先決條件時(路徑名既不是 null 也不是空的,並且它是一個有效的文件名(我假設有一個IsValidFileName函數我可以調用) )。

但另一個地方是,如果我嘗試執行操作並且它拋出(我沒有檢查File.ReadAllLines實際上曾經拋出IOException ,但我猜它可以)。 在這種情況下,我不想讓我的用戶因捕獲可能的IOException而增加負擔,而是將其轉換為我記錄的ApplicationException 我用我的ApplicationException的捕獲和拋出來包裝IOException ,但我將IOException作為內部異常包括在內,以便調試和跟蹤其他問題。 代碼如下:

public IEnumerable<string> AccessFile(string pathName)
{
    if (string.IsNullOrEmpty(pathName) || !IsValidFileName(pathName))
    {
        throw new ApplicationException("Invalid Path Name");
    }

    try
    {
        var result = File.ReadAllLines(pathName);
        return result;
    }
    catch (IOException ex)
    {
        throw new ApplicationException("Error Accessing File", ex);
    }
}

ApplicationException 的第二個參數設置了內部異常。 這種模式常見。


另一個例子是@Jonesopolis 所描述的。

在這里,我有一個工作功能在做某事。 我的應用程序架構要求我在DoSomethingImportant函數所在的級別進行日志記錄。 因此,它會捕獲在較低級別拋出的任何異常。 但是,該代碼想要向DoSomethingImportant函數的調用者冒泡任何異常。 在這里,它只使用沒有參數的throw關鍵字。 這將重新拋出當前異常並讓它冒泡。

使用throw;很重要throw; 不帶參數,不throw ex; . 前者允許現有的異常冒泡。 后者在捕獲點展開堆棧,然后拋出一個新異常,丟失可能指向故障位置的所有堆棧信息。

這是我正在談論的典型代碼。 這也是一個非常常見的模式:

public void DoSomethingImportant()
{
    try
    {
        DoSomethingLowLevel();
    }
    catch (Exception ex)
    {
        GetLogger().Log(ex);
        throw;
    }
}

暫無
暫無

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

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