2016-11-17 47 views
0

我想獲得處理異常的理想方法。我搜索了&,我應該把trycatch放在catch塊中,以便處理,但是如果在嵌套塊本身發生了什麼異常。如何處理catch塊中的異常?

try 
{ 

      int a = 10; 
      int b = 0; 

      int c = a/b; 

      Console.WriteLine(c); 
      Console.ReadKey(); 
     } 
     catch (Exception ex) 
     { 
      int a = 10; int b = 0; 
      int c = a/b; 
      Console.WriteLine(ex.Message.ToString()); 
      Console.ReadKey(); 
     } 
     finally 
     { 
      Console.WriteLine("Some Exception"); 
     } 

在google搜索,我讀了它應該如下佈置:

如果我這樣做,那麼它會卡在一個無限的try-catch塊。

我認爲會有一些更好或正確的方式來處理這種情況。

+1

在某些情況下,如果您的代碼處於您的異常處理中發生異常的狀態,您應該會發生崩潰。如果應用程序崩潰並不好,您需要考慮您的代碼如何「紓困」,或中止造成問題的流程。 –

+0

我會與上面的評論。從我的視角來看,這是一個設計問題,而不是語言問題。我也可以用'if'語句構建上面的例子 - >如果出錯了,我執行失敗處理 - >如果失敗處理出錯,我執行失敗處理,如果.... – Moerwald

+0

重要的是你學會了很很快發現異常處理是**糟糕的** _unless_您有一個特定的異常,您可以捕捉並且可以正確處理。如果你曾經寫過'catch(Exception ...)',那麼你可能會讓你的生活變得更加艱難 - 不容易。 – Enigmativity

回答

2

首先你需要知道的是什麼嘗試,趕上最後的作品,讓我們開始:

  1. 嘗試:此塊中,我們可以寫一個不得不放棄一些錯誤的可能性代碼(更好的做法是在寫代碼的一部分)

  2. 漁獲:它負責顯示錯誤,什麼錯誤,如果出現做(就像在你的代碼10/0拋出錯誤,可以在本節進行處理)

  3. 最後:代碼寫在thi部分將執行任何錯誤進入或不進行的天氣。

現在爲您的查詢,它會更好,你可以使用If ... else在最後,代碼放在該部分將保存在try catch塊。

例如:

bool flagCatch=false; 
try 
{ 

    int a = 10; 
    int b = 0; 

    int c = a/b; 

    Console.WriteLine(c); 
    Console.ReadKey(); 
} 
catch (Exception ex) 
{ 
    //Error handling 
    flagCatch=true; 
    Console.WriteLine(ex.Message.ToString()); 
    Console.ReadKey(); 
} 
finally 
{ 
    try 
    { 
     if(flagCatch) 
     { 
      //Code 
     } 
     else 
     { 
      //Code when error not comes 
     } 
    } 
    catch(Exception err) 
    { 
     //Error handling 
    } 
} 
2

我認爲會有一些更好的或處理這種情況的正確方法。

沒有snark打算在這個,但簡單地說,不要讓例外發生在第一位。

A try...catch是一種語言結構,可以確保您處理邊緣案例或您並未緩解和設計的錯誤,因此它爲什麼是特殊的代碼。

在您的代碼中,由於除數爲0,您只是拋出一個錯誤,但在現實世界中,您希望處理該錯誤並提醒用戶(或開發人員,服務器或其他人),並且然後處理實際的特殊代碼,例如:

static void PrintError() 
{ 
    Console.WriteLine("You must enter a valid number between {0} and {1}, excluding 0", int.MaxValue, int.MinValue); 
} 

static void Main(string[] args) 
{ 
    try { 
     int a = 10; 
     int b = 0; 
     PrintError(); // Tell user to enter valid numbers 
     while (b == 0) { 
      string user_input = Console.ReadLine(); 
      if (int.TryParse(user_input, out b)) { // is it an actual number? 
       if (b == 0) { // no 0's remember user!?? 
        PrintError(); 
       } else { 
        // ok, everything checks out, so do what the system can actually handle without throwing an error 
        Console.WriteLine("a/b = {0}", (a/b)); 
       } 
      } else { 
       PrintError(); 
      } 
     } 
    } catch (Exception ex) { 
     Console.WriteLine("Something exceptional happened: {0}", ex); 
    } 
} 

這個例子可以進一步簡化,但它表明沒有可能除了一些實際發生的異常,實際上是例外(即內存不足的錯誤或一些其他系統錯誤)。

如果代碼庫中有多個類,那麼異常處理程序和終結器就是您可以清理代碼其他區域中獲取的資源的位置,如關閉套接字或文件句柄以確保數據不會丟失。

如果在異常處理程序中發生錯誤(可能發生的事情),您需要知道這一點,並知道在這種情況下可能發生的情況。

在使用.NET框架的C#應用​​程序中,異常中引發的異常將導致應用程序與內部異常堆棧跟蹤(相對於可能與實際更相關的「外部」異常例外)。

有很多「錯誤」的方式來處理異常(比如根本不處理它們),但鑑於異常的可變性質,並沒有真正的「正確」方式。

希望能有所幫助。

0

我會去評論泰森噸。從我的角度來看,這是一個設計問題。

我也可以用if語句建立一個例子 - >如果出了問題,我進行故障處理 - >如果故障處理不順心,我進行故障處理,如果故障處理出錯....

爲了使代碼更易讀,你可以嘗試「隱藏」 try-catch塊的方法,如:

static void PerformInTryCatch<T, TException>(Action<T> action, T obj) where TException : Exception 
    { 
     try 
     { 
      action(obj); 
     } 
     catch (TException exception) 
     { 
      // Perform some logging 
     } 
    } 

希望有所幫助。