2015-03-25 32 views
4

如果我想要寫一個文件和處理IOExceptions(如果該文件是寫保護),我會做到以下幾點:處理不可預見的異常

try 
{ 
    var fs = new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.None); 
    using (StreamWriter sw = new StreamWriter(fs, Encoding.Default) 
    {  
     sw.WriteLine(entry); 
    } 
} 
catch (IOException ex) 
{ 
    return ex.Message; 
} 

如果我得到一個意外的異常我的計劃會崩潰,用戶會報告錯誤,我會解決它。這就是我想要的。

所以我要補充另一個抓這樣的:

catch (Exception) 
{ 
    throw; 
} 

這會不會使任何區別,什麼是最好的做法?

回答

3

你應該處理突發異常向用戶呈現,但有throw一個catch是多餘的 - 異常反正你的方法被拋棄了。你應該問自己一個問題:「我能在這裏做些什麼?」。對於IOException,答案很清楚。您希望發生異常,可以處理它,並且可以繼續。在通用Exception的情況下,這可能不是處理它的地方。

如果在發生異常時需要運行一些代碼,請爲其添加一個catch。如果您的代碼在該異常之後無法繼續,請拋出異常更高(未處理該異常或使用throw),並在調用層次結構中向上調整處理程序。也許它可以在更高層次上處理,並且可以繼續執行。否則,您的應用程序將需要退出。

您可以在程序的入口點添加頂級try/catch塊,並在那裏捕獲未處理的異常。你的應用程序甚至可以在這之後繼續下去(但是,在任何非平凡的應用程序中,考慮到此時拋出的異常程度有多高)不太可能。要捕獲任何其他未處理的異常(例如,在線程中未處理的異常),可以向AppDomain.CurrentDomain.UnhandledException添加處理程序。但是,這是不可恢復的 - 您的應用程序將在之後直接退出。 UnhandledException處理程序是在發生異常之前對異常執行某些操作的最後機會,通常將其記錄爲診斷出錯的地方。噢,另外,如果你正在編寫一個WPF應用程序,你可以在你的App.xaml中添加一個處理程序來處理Application上的DispatcherUnhandledException事件。這會捕獲WPF調度程序線程中發生的任何未處理的異常。與上面的AppDomain處理程序不同,調度程序線程上的未處理異常可以繼續執行 - 如果可以繼續應用程序,則可以將事件參數中的IsHandled設置爲true

0

您好,如果你想拋出異常,應用程序會崩潰做到這一點

try 
{ 
    var fs = new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.None); 
    using (StreamWriter sw = new StreamWriter(fs, Encoding.Default) 
    {  
     sw.WriteLine(entry); 
    } 
} 
catch (IOException ex) 
{ 
    throw ex; 
} 

但在我看來,你不應該讓它破碎而只顯示錯誤消息

在catch通話功能

寫入文件,然後返回消息並顯示給用戶。希望它可以幫助

public static void WriteCustomLog(string msg) 
      { 
       FileStream fs = null; 
       StreamWriter sw = null; 
       FileStream fs1 = null; 
       StreamWriter sw1 = null; 
       try 
       { 
        //check and make the directory if necessary; this is set to look in the application 
        //folder, you may wish to place the error log in another location depending upon the 
        //the user's role and write access to different areas of the file system 
        if (!System.IO.Directory.Exists(Application.StartupPath + "\\Log\\")) 
         System.IO.Directory.CreateDirectory(Application.StartupPath + "\\Log\\"); 

        string date = DateTime.Now.ToString("dd_MM_yyyy"); 

        //check the file 
        fs = new FileStream(Application.StartupPath + "\\Log\\Log" + date + ".txt", FileMode.OpenOrCreate, FileAccess.ReadWrite); 
        sw = new StreamWriter(fs); 
        sw.Close(); 
        fs.Close(); 

        //log it 
        fs1 = new FileStream(Application.StartupPath + "\\Log\\Log" + date + ".txt", FileMode.Append, FileAccess.Write); 
        sw1 = new StreamWriter(fs1); 
        sw1.Write(DateTime.Now.ToString() + " Message: " + msg + Environment.NewLine); 
        sw1.Write("Date/Time: " + DateTime.Now.ToString() + Environment.NewLine); 
        sw1.Write("=======================================================" + Environment.NewLine); 

       } 
} 

,然後處置 未測試

+0

我不希望應用程序崩潰在IOException上,因爲我可能會發生並因此發生它。它是關於我不除外的例外。我應該抓住他們,拋出或不做任何事情。 – Daltons 2015-03-25 10:40:47

+0

因此,在異常顯示中將消息返回給用戶並寫入帶有錯誤的自定義日誌(返回ex.Message;) – Max 2015-03-25 10:44:31

+2

這會重置堆棧跟蹤 – 2015-03-25 10:45:09

-1

你可以捕獲該異常,然後檢查裏面,什麼類型的expception是對象。然後決定如何處理它。

catch(Exception ex) 
{ 
    if(ex.InnerException is IOException) 
    { 
    // do something 
    } 
else 
    { 
    // do something else 
    } 
} 
+1

爲什麼?您可以捕獲(IOException),然後通過鏈接處理程序來回退到Exception()。 – kha 2015-03-25 10:42:05

+1

@kha:你沒注意到他檢查了INNER異常嗎?你無法理解。 – jgauffin 2015-03-25 10:46:22

+0

@jgauffin問題是關於捕獲IOException和調用方法時可能發生的其他類型的異常,並且此答案檢查捕獲所有異常的內部異常作爲執行此操作的一種方式。這種方法是錯誤的:並不是每個異常都有一個InnerException,並且並不是每個IOException都被重新拋出(事實上,如果它是重新拋出IOException的標準行爲,我會感到驚訝),這意味着此解決方案不會處理IOException異常的原因,而不是作爲IOException對象的InnerException異常的另一種類型重新拋出。 – kha 2015-03-25 10:56:03

1

所以我要補充另一個像抓

(幾乎)從不。至少沒有在堆棧跟蹤中。它會讓你的應用程序更難閱讀。

大多數應用程序都有切入點。例如,如果您正在編寫Windows服務,則通常會爲該工作創建線程。你可以有一個catch (Exception),以防止它們崩潰。

所以我說的是,你應該在大多數情況下只使用捕獲全部在頂層,以防止你的應用程序難以閱讀或維護。

當一切都失敗

有時你的應用程序崩潰,無論如何,如果你已經忘記了一個包羅萬象的地方在頂層。

然後,您需要使用AppDomain.UnhandledException,因爲它在.NET中調用所有應用程序類型。但是,它不會讓你阻止應用程序開發,而只是爲了記錄你的應用程序即將崩潰的原因。

如果您正在編寫基於winforms的UI應用程序,則可以使用Application.ThreadException代替。但是,它只會處理UI線程中的異常。因此,您仍然需要使用AppDomain.UnhandledException來記錄其他線程上拋出的異常。

.NET中的所有主要庫/框架都有它自己的方法來允許您處理未處理的異常。您需要查看您正在使用的庫的文檔。

+0

您也可以使用我們的服務http://onetrueerror.com,爲您提供所有集成服務。 – jgauffin 2015-03-25 10:47:30

0
catch(Exception) 
{ 

    throw;  
} 

什麼都不做。它的原始堆棧跟蹤引發異常,並且不執行其他操作。你能趕上一般例外,它給你的選項,以提供額外的記錄和/或一個更好的錯誤信息

catch(Exception ex) 
{ 
    LogError(ex); 
    if (weDontCareThisWasntImportantAnyWay) 
    { 
     if (theUserShouldBeNotifiedAtThisPoint) 
     { 
      SomehowNotifyTheUser(ex); 
     } 
    } 
    else 
    { 
     //Maybe something else cares 
     throw;  
    } 
}