2015-10-17 80 views
-1

我想要做的看起來像如何捕獲System.Exception的各種擴展並確定拋出哪個擴展?

 catch (Exception e) 
     { 
      Type etype = e.GetType(); 
      if (etype == ArgumentException.GetType()) 
      { 
       Console.WriteLine("Invalid Arguments: {0}", e.Message); 
      } 
      else if (etype == ArgumentOutOfRangeException.GetType()) 
      { 
       Console.WriteLine("Arguments Out of Range: {0}", e.Message); 
      } 
      // ... 
     } 

和我越來越

的對象引用需要非靜態字段,方法或 財產「系統錯誤.Exception.GetType()'

這個錯誤在我的上下文中意味着什麼?我的方法有什麼根本的缺陷?

+3

東西告訴我你不是真正的唐納德克努特。 –

回答

2

只是對預期的異常類型單獨catch塊:

try 
{ 
    // do something 
} 
catch (ArgumentException e) 
{ 
    // respond to an ArgumentException 
} 
catch (ArgumentOutOfRangeException e) 
{ 
    // respond to an ArgumentOutOfRangeException 
} 
// ... 
1

你不能做到這一點。

GetType僅適用於實例化的異常對象。

您應該使用

catch (ArgumentOutOfRangeException e) 
{ 
[...] 
} 
catch (ArgumentException e) 
{ 
[...] 
} 

你應該總是catch爲了從更具體的少。

2

你可以做,而不是執行以下操作:

try { 
    ... 
} 
catch (ArgumentOutOfRangeException e) 
{ 
    Console.WriteLine("Arguments Out of Range: {0}", e.Message); 
} 
catch (ArgumentException e) 
{ 
    Console.WriteLine("Invalid Arguments: {0}", e.Message); 
} 

,並在C#6.0,你可以進一步指定搭上根據您設置條件,例外情況。例如:

// This will catch the exception only if the condition is true. 
catch (ArgumentException e) when (e.ParamName == "myParam") 
{ 
    Console.WriteLine("Invalid Arguments: {0}", e.Message); 
} 
2

你剛纔:

catch (ArgumentException e) 
{ 
    // Handle ArgumentException 
} 
catch (ArgumentOutOfRangeException e) 
{ 
    // Handle ArgumentOutOfRangeException 
} 
catch (Exception e) 
{ 
    // Handle any other exception 
} 
1

只能在一個對象實例調用GetType()。如果你想保持你的風格(而不是單獨的catch塊,如在其他答案中):

catch (Exception e) 
    { 
     Type etype = e.GetType(); 
     if (etype == typeof(ArgumentException)) 
     { 
      Console.WriteLine("Invalid Arguments: {0}", e.Message); 
     } 
     else if (etype == typeof(ArgumentOutOfRangeException)) 
     { 
      Console.WriteLine("Arguments Out of Range: {0}", e.Message); 
     } 
     // ... 
    }