簡體   English   中英

如何在不使用 try catch 的情況下處理異常?

[英]How to handle exception without using try catch?

using (SqlConnection con = new SqlConnection())
{
     try
     {
          con.Open();
     }
     catch (Exception ex)
     {
          MessageBox.Show(ex.Message);
     }
}

這工作正常。 但我想知道我們是否可以在不使用try catch情況下處理異常if else 或者它是使用try catch補充。

除了 try catch 之外,沒有其他機制可以處理異常。 聽起來你想要類似的東西

if(connection.DidAnErrorOccur)

但那不存在。

好的,您可以在 global.asax 中實現 de Application_Error ,此方法是錯誤的第一道防線,適用於所有應用程序

http://msdn.microsoft.com/en-us/library/24395wz3%28v=vs.100%29.aspx

對於特定頁面,例如 default.aspx,您可以實現Page_Error

http://msdn.microsoft.com/en-us/library/ed577840%28v=vs.100%29.aspx

如果您在 mvc 中工作以便您可以在您想要的每個控制器中實現OnException(ExceptionContext filterContext) ,則在發生未處理的異常時調用此方法。

http://devproconnections.com/aspnet-mvc/aspnet-mvc-tutorial-handling-errors-and-exceptions

或者你可以實現你的錯誤屬性

https://www.simple-talk.com/dotnet/asp.net/handling-errors-effectively-in-asp.net-mvc/

另一方面,也許您可​​以使用Assert 語句,這樣您就可以評估條件

http://msdn.microsoft.com/en-us/library/ttcc4x86.aspx

唯一的方法是檢查所有會返回錯誤的條件。 無論如何你應該這樣做。 嘗試/捕獲是昂貴的。 Try catch 應該是最后的手段,為此沒有辦法繞過它。

我能給你的最好的選擇是 Elmah。 http://code.google.com/p/elmah/它將處理所有未捕獲的錯誤並記錄它們。 從那里我建議修復所述錯誤或捕獲您期望的特定錯誤,而不僅僅是捕獲可能發生的任何錯誤。 最好這樣做,以便您可以修復潛在問題,而不是因為發生異常而簡單地跳過代碼。

Tejs 的回答是正確的,我相信沒有其他機制可以處理錯誤。

但是,您可以處理更具體的錯誤。 您還可以在 try catch 之外聲明變量以查看它是否成功。

例子:

using (SqlConnection con = new SqlConnection())
{
     bool sqlErrorOccurred;

     try
     {
         con.Open();
         sqlErrorOccurred = false;
     }
     catch (SqlException ex)
     {
          sqlErrorOccurred = true;
     }

     if(sqlErrorOccurred)
     {
         MessageBox.Show("A Sql Exception Occurred");
     }
}

上面的答案是正確的。 但是,要注意的另一件事是可以設置全局異常處理程序。 這並沒有解決前面提到的防御性編碼的需要。 但是,如果擔心需要處理所有異常(例如,記錄錯誤),那么這種方法可能非常有用。

我正在構建一個使用實時流數據的系統,因此需要處理在其他一切都非常空閑時可能發生的錯誤。 我正在使用的 API 通過名為“error”的方法將錯誤傳遞回程序,並附加異常。 這個方法可能會拋出錯誤,但這是有問題的,因為我看不出把我的整個程序完全放在一個 try-catch 塊中是一個好主意。

因此,為了解決這個問題,我將設置一個事件處理程序來觸發我程序主要部分中的事件,然后它可以及時處理在該時間點拋出的任何錯誤。

例如:

在主類中:

private void Error(object sender, EventArgs e) {

    Exception ex = sender as Exception;

    Console.WriteLine("Error: " + ex); // Or whatever you want to do with the exception

    // You could even add this if you want to then use the try -catch sequence (which 
    // makes the exception easier to parse and also enables you to stop the program
    // with unhandled exceptions if it's something catastrophic:

    try {

        throw ex;
    } catch (put.your.exception.detail.here) {

        // do stuff
   } finally {

       // do other stuff
   }
}

(在從 API 接收錯誤的類中):

class Foo {
    public event EventHandler ThrowError;

    protected virtual void OnError(Object src, EventArgs e) {

        if (ThrowError != null) {

            ThrowError(src, e);
        }
    }

    private virtual void error(Exception e) {

        OnError(e, EventArgs.Empty);
    }
}

在 .NET core 3.1(或之前?)中,您可以為未處理的異常設置全局捕獲器。 但是,此后該應用程序將不會繼續運行。

下面是一個例子:

https://docs.microsoft.com/en-us/dotnet/api/system.appdomain.unhandledexception?redirectedfrom=MSDN&view=netcore-3.1

暫無
暫無

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

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