2017-08-30 51 views
1
namespace Rextester 
{ 
    public class BaseException : Exception 
    { 
     public BaseException() { } 
    } 

    public class Program 
    { 
     public static void MethodA(BaseException e) 
     { 
      Console.WriteLine("BaseException"); 
     } 

     public static void MethodA(Exception e) 
     { 
      Console.WriteLine("Exception"); 
     } 

     public static void Main(string[] args) 
     { 
      try 
      { 
       throw new BaseException(); 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine(e.GetType()); 
       MethodA(e); 
      } 
     } 
    } 
} 

好傢伙我根據上述執行的代碼的結果有一個問題:)C#選定重載方法在運行時

e.GetType(== Rextester.BaseException

治法寫入到控制檯:異常

因此,即使異常的類型是派生類,爲什麼在運行時沒有調用具有參數BaseException的特定重載方法,並且被稱爲帶Exception的那個?

+0

你的問題不清楚。請添加更多描述 –

+1

Idk此處不清楚:o – sTrenat

回答

4

在以下try/catch塊:

try 
{ 
    throw new BaseException(); 
} 
catch (Exception e) 
{ 
    Console.WriteLine(e.GetType()); 
    MethodA(e); 
} 

拋出一個異常,並在捕獲異常的類型爲Exception,不BaseException。你基本上扔了一個BaseException,但BaseException繼承Exception。所以你進入catch塊。

如果你想趕上BaseException你應該首先理解這一點,因爲它更具體。

try 
{ 
    throw new BaseException(); 
} 
catch (BaseException e) 
{ 
    Console.WriteLine(e.GetType()); 
    MethodA(e); 
} 
catch (Exception e) 
{ 
    Console.WriteLine(e.GetType()); 
    MethodA(e); 
} 

順便說一句,這是更清晰的名稱DerivedException比名BaseException。 .NET中的所有異常類型以及自定義異常類型,我們爲我們的需求定義的異常類型都繼承自Exception類。所以他們都是類Exception的派生類。

上面也可以如以下發現here

例外具有以下性質:

  • 例外的是,所有最終從System.Exception派生類型。
  • 一旦try塊中發生異常,控制流跳轉到第一個關聯的異常處理程序,該處理程序在調用堆棧中的任何地方出現 。在C#中,catch關鍵字用於定義 異常處理程序。

除了上面,你會發現有用的this,它指出,隨着不同的異常過濾器

多個catch可以鏈接在一起的內容。 catch代碼塊在代碼中從上到下進行評估,但 只有一個catch代碼塊針對每個引發的異常執行。 第一個catch塊指定了確切的類型或基類 執行拋出的異常。如果沒有catch塊指定與匹配的異常過濾器匹配的 ,則選擇沒有過濾器 的catch塊(如果語句中存在該塊)。這是 具有最具體位置catch塊是重要的(即,最 衍生)的異常類型第一

0

功能MethodA被聲明爲靜態。因此任何綁定到函數都是在編譯時。