簡體   English   中英

試圖圍繞異常以及何時使用它們

[英]trying to wrap my head around exceptions and when to use them

我對編碼並不陌生,我已經做了很長時間了,在工作中我使用了 Java,所以當編譯器告訴我時我只使用了一個 try-catch 塊。 在 c# 中,因為異常會冒泡,編譯器不會強迫您使用它。 我知道當我可以從異常中恢復時我應該使用 try-catch 塊,但老實說這對我沒有多大幫助,因為我從來沒有覺得需要使用它們。 對於數據庫,我只使用 using 語句,如果代碼在 Web Api 中並且由於無法與數據庫連接而失敗,它會自動返回 500 內部服務器錯誤,因此我實際上不需要對它做任何事情。

我已經閱讀了很多關於該主題的內容,但實際上無法考慮何時應該使用 try-catch 塊而不是僅使用或不執行任何操作,而且我知道這可能會阻礙我的改進。

這個答案並不是包羅萬象的。 我只是想舉幾個例子。

日志記錄

使用異常對於記錄錯誤非常有用。 您甚至可能希望在完成日志記錄后重新拋出異常。 了解正在拋出什么異常、何時拋出、多久拋出等等……對於調試或改進代碼庫非常有用。

例子:

try
{
  DoThingThatFails();
}
catch (ExpectedException ex)
{
  LogException(ex, DateTime.Now);

  //rethrow the exception
  throw;
}

建立圖書館

這可以是內部或公共圖書館。 異常是處理不正確或不受支持的操作的好方法。 假設您有一個需要接受字符串的類。 它絕對需要有一個有效的非空字符串傳遞給它。 如果庫的用戶(可能是您或其他人)傳入無效值,例如null ,您可以拋出異常。

例子:

class Example
{
  //name must be a valid, non-empty string
  public Example(string name)
  {
    if (String.IsNullOrEmpty(name))
      throw new InvalidOperationException("The name parameter was null or empty");

    //Initialize your new object
  }
}

就個人而言,我在我編寫的任何非平凡代碼中都采用了 try/catch。 如果我想處理一個特定的異常,我會為此添加一個 catch 塊,如果我沒有,我有一個標准塊,我使用它會傳遞我認為有用的信息。

但總的來說,網絡上有大量關於該主題的信息。 我建議您閱讀一些書,然后決定哪種方法最適合您。

using 塊不會讓您從異常中恢復,它只是確保在發生未捕獲的異常時處理資源。 了解應用程序中的異常處理對您來說至關重要。 您不需要捕獲每個異常,但您至少應該在應用程序的入口點捕獲異常以防止崩潰。

讓我們使用一個例子,因為這有助於我最好地理解概念。

想象一下,我們正在創建一個 WPF 應用程序,當用戶按下按鈕時,將提交數據庫調用並返回一些資源。 如果您的數據庫由於某種原因離線,並且您沒有在 try/catch 中調用數據庫,而是在 using 塊中調用它,則應用程序將崩潰,並且會給您的用戶留下不好的印象,或者無法幫助您解決報告問題。 如果我們在數據庫調用周圍引入 try/catch,我們可以更優雅地讓用戶知道錯誤並處理我們的數據庫問題。

try 
{
     //Some db access has failed
}
catch(DbOfflineException ex)
{ 
    // Show message box to user 
    // Notify IS DB Team about critical issue
    // Rethrow if our calling method also has a try catch
}
catch(Exception ex)
{
    // If the exception isn't of type DbOfflineException we
    // would get to this catch block and could handle differently
}

如果您想要對上面演示的 DbOfflineExceptions 或 Generic Exceptions 進行特定處理,您還可以鏈接不同的異常類型。

查看這篇文章了解更多信息: https : //docs.microsoft.com/en-us/dotnet/standard/exceptions/

異常是一種將錯誤處理代碼與業務邏輯代碼分開的方法。 在異常處理之前,在最壞的情況下,在每個函數調用之后都有錯誤處理,並檢查返回值是否發生錯誤。 這會使代碼不可讀,您可能會忘記檢查錯誤代碼。

在您的情況下,框架會捕獲所有異常並返回內部服務器錯誤。 這是一個通用的異常處理。 沒關系,所以服務不會意外停止。 但是我認為您需要了解有關錯誤的信息並將其保存在日志文件中,或者必須更具體地通知用戶發生了哪個錯誤。 這是您應該使用異常處理的時候。

暫無
暫無

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

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