2013-11-14 43 views
0

例如如何知道哪個特定的異常趕上

try 
{ 
    Application.Exit(); 
} 
catch (Exception ex) 
{ 
    MessageBox.Show(ex.Message); 
    //throw; 
} 

這是一般異常。如何知道使用哪一個以及何時使用?

+1

你無法確定,除非*你*沒有提高它們,出於某種原因。 – Tigran

+1

永遠不會,*永遠不會捕獲這樣的異常。 Application.Exit()失敗是一個永遠無法正確處理的情況。 –

回答

4

How to know wich one to use and when ?

這取決於您在try區塊中試圖執行的操作。假設您使用SqlCommand來檢索一些記錄,那麼最好先抓SqlException,然後再抓Exception抓其他人。

try 
{ 
    using(SqlCommand cmd = new SqlCommand(....)) 
    { 
     //........ 
    } 
} 
catch (SqlException se) 
{ 
    //logging etc. 
} 
catch (Exception ex) 
{ 
    //logging etc 
} 

只記得首先要捕捉特定的例外,並移動到基地Exception。至於你的問題,哪些例外,你不能確定他們,這就是爲什麼他們被稱爲例外,你只能預測並相應地捕捉。

+1

@Downvoter,如果你可以改進這個職位,會很高興 – Habib

+0

不是downvoter,但你可以通過提及大多數人通過閱讀該方法的文檔來完成確定要捕獲哪些異常的魔術。 )他們在打電話。我不相信有人真的回答了這個傢伙的問題,但主要是因爲我不確定他說得好不好。 – trope

+0

也就是說,我相信他的問題是他不知道SqlException存在,也不知道他的方法調用是否會導致它被拋出,也不知道如何知道SqlException甚至存在作爲有效的異常來捕獲,而不是他doesn不瞭解如何構建catch塊。我可能在這裏是錯的,但這就是我如何閱讀原始問題。它也可能是兩者的組合。 – trope

0

您可以定義多個catch塊。像:

 try 
     { 
      var result = 8/0; 
     } 
     catch (DivideByZeroException ex) 
     { 
      // Here, a more specific exception is caught. 
     } 
     catch (Exception ex) 
     { 
      // Otherwise, you'll get the exception here. 
     } 
0

您想要在程序中使用結構化異常處理(SEH)。

存在3種錯誤的一切,你必須要注意的,首先:

  • PROGRAMM錯誤
  • 用戶錯誤
  • 例外

所以你必須在C#中使用SEH只是在可以創建異常的情況下,但在程序運行期間,您無法執行任何操作。在創建方法期間,如果方法無法執行請求的任務時避免出現情況,則必須設置異常。在這個過程中,您必須注意2點要點(如Rihter寫在他的一本書中):

首先,您必須瞭解可以創建哪種類型的Exception。這種類型必須非常仔細選擇,爲此目的,您可以使用FCL(框架類庫)中的現有類型之一,但有時可能會出現這種情況,當您請求自己類型的異常時。例如,如果您使用Input-Otput類,則可以使用以下異常類型之一 - System.IO.DirectoryNotFoundException, System.IO.DriveNotFoundException, System.IO.EndOfStreamException, System.IO.FileLoadException, System.IO.FileNotFoundException, System.IO.PathTooLongException, System.IO.PipeException

其次,您必須選擇將發送給異常構造函數的消息。意味着您必須能夠從您的方法中找到詳細信息 - 何時以及爲何創建此異常。

而且創造例外,您可以使用未來shablon

void SomeMEthod(){ 
try 
{ 
    //your code to do 
} 
catch (ExceptionType1) //here put code with Exception 1 
{ 
// you can add some specific code here for working with your exception 
} 
catch (ExceptionType2) //here put code with Exception 2 
{ 
// you can add some specific code here for working with your exception 
} 
catch (EXCEPTION) //here put code with rest types of Exception 
{ 
// you can add some specific code here for working with your exception 
} 
finally 
{ 
//here put code that allow you to free your resourses 
//NOTE: this code will be launched always! 
} 
//here you can placed code, that will be launched if no Exception will be found 
} 

同時請注意,EXCEPTION必須包括ExceptionType2ExceptionType1,並ExceptionType2必須包括ExceptionType1 - 這允許你使用一些hierarhy捕捉例外 - 否則 - EXCEPTION將捕獲你所有的異常。

你也可以在你的catch塊添加關鍵字thow - 雙工作,現有的異常

catch (EXCEPTION) //here put code with rest types of Exception 
{ 
// you can add some specific code here for working with your exception 
throw; 
} 

另外你一定要明白,如果你捕捉異常使用的代碼 - 你知道它可以。所以你可以做點什麼把它拿走。您必須以這種方式創建您的代碼,並且try-catch-funally塊的q-ty完全符合您的程序要求。

有關C#中異常類的詳細信息,您可以找到HERE

相關問題