我想寫一些嘗試和捕獲任何類型或異常,這段代碼是否足夠(這是在Java中的方式)?如何使用try和catch在c#中捕獲所有異常?
try {
code....
}
catch (Exception ex){}
還是應
try {
code....
}
catch {}
?
我想寫一些嘗試和捕獲任何類型或異常,這段代碼是否足夠(這是在Java中的方式)?如何使用try和catch在c#中捕獲所有異常?
try {
code....
}
catch (Exception ex){}
還是應
try {
code....
}
catch {}
?
這兩種方法都會捕獲所有異常。除了第一個代碼示例會生成編譯器警告,因爲ex
已被聲明但未被使用,您的兩個代碼示例之間沒有顯着差異。
但請注意,一些例外情況是特殊的,會自動重新排列。
ThreadAbortException
是一個特殊的例外,可以被捕獲,但它會自動在catch塊結束時再次提出。
http://msdn.microsoft.com/en-us/library/system.threading.threadabortexception.aspx
正如在評論中提到的,它通常是一個非常糟糕的主意趕上並忽略所有例外。通常您想要執行以下其中一項操作:
捕獲並忽略您知道的並非致命的特定異常。
catch (SomeSpecificException)
{
// Ignore this exception.
}
捕獲並記錄所有異常。
catch (Exception e)
{
// Something unexpected went wrong.
Log(e);
// Maybe it is also necessary to terminate/restart the application.
}
捕獲所有異常,做一些清理,然後重新拋出異常。
catch
{
SomeCleanUp();
throw;
}
注意的是,在最後一種情況異常被重新拋出使用throw;
而不是throw ex;
。
但是不幸的是,在發佈模式下,這將不會捕獲所有的異常:/ – Muflix
Muflix能詳細說明爲什麼catch {}不會捕獲所有異常釋放模式[?]? –
兩者都很好,但只有第一個可以讓你檢查異常本身。
兩者都吞下異常,你應該只捕捉異常來做一些有意義的事情。隱藏一個問題是不是有意義!
兩種方式都是正確 如果你需要做的異常物體東西在catch塊比你應該使用
try {
code....
}
catch (Exception ex){}
,比catch塊使用前。
無論如何,這並不總是一個很好的做法來引導異常類,這是一個更具體的異常的實踐 - 一個你可以期待的異常。
所有例外都來自Exception
,所以上述兩者都可以使用。
我會問爲什麼你想這樣做,但。你只應該捕獲可以恢復的異常。其他一切都會讓你的應用程序死於可怕的熾烈死亡。應用程序崩潰比繼續可能的損壞狀態更好。
我不想處理這個異常。我只是希望我的程序不會崩潰,如果它發生... –
那麼,出現了什麼問題,你不打算讓用戶知道它發生了什麼?... –
實際上有多種可能的用例這個。當從Web服務批量獲取(例如)多個(50 000+)資源時,我絕對想要捕獲所有可能的錯誤(包括但不限於:無效http錯誤,服務超時,返回500內部服務器錯誤的服務),記錄它們,然後繼續。這裏的重點是,我還不知道這個工作可能會因個人網絡通話而失敗的所有方式。 –
請注意,除了所有其他評論有一個小的差異,這裏應該提到的完整性!
使用空的catch子句,您可以在程序集標記爲「RuntimeCompatibility(WrapNonExceptionThrows = false)」(默認爲CLR2時爲true)時捕獲非CLSCompliant異常。 [1] [2] [3]
[1] http://msdn.microsoft.com/en-us/library/bb264489.aspx
[2] http://blogs.msdn.com/b/pedram/archive/2007/01/07/non-cls-exceptions.aspx
[3] Will CLR handle both CLS-Complaint and non-CLS complaint exceptions?
我捕獲所有的異常,並將其存儲在數據庫中,因此錯誤可以很容易地被糾正 - 網頁,地點,日期等存儲
try
{
Cart = DB.BuyOnlineCartMasters.Where(c => c.CmpyID == LoginID && c.Active == true).FirstOrDefault();
}
catch (Exception e)
{
ErrorReport.StoreError("CartMinifiedPartial-Company", e);
-- storing the error for reference
}
存儲
public static void StoreError(string ErrorPage, Exception e)
{
try
{
eDurar.Models.db_edurarEntities1 DB = new Models.db_edurarEntities1();
eDurar.Models.ErrorTable Err = new eDurar.Models.ErrorTable();
Err.ErrorPage = ErrorPage;
if (e.Message != null)
{
Err.ErrorDetails = e.Message;
}
if (e.InnerException != null)
{
Err.InnerException = e.InnerException.Message.ToString();
}
Err.Date = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, TimeZoneInfo.FindSystemTimeZoneById("India Standard Time"));
DB.ErrorTables.AddObject(Err);
DB.SaveChanges();
}
static void Main(string[] args)
{
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
}
static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
throw new NotImplementedException();
}
代碼只是答案不是很好的答案,嘗試添加幾行解釋問題是什麼以及代碼如何修復它 – MikeT
嘗試 {
.. .. ..
}
趕上(例外前){
.. .. ..
} Exception ex意味着所有的例外。
你爲什麼要這麼做?你應該只捕獲你可以處理的異常。 – Oded
兩者都會工作... – pengibot
谷歌這不是很容易嗎? – jgauffin