为什么我不能在C#中捕捉到一个通用的exception?

我正在对代码进行一些unit testing,这些代码可能会根据input引发许多exception。 所以我尝试了下面的代码:(例如简化)

static void Main(string[] args) { RunTest<ArgumentException>(); } static void RunTest<T>() where T : Exception, new() { try { throw new T(); //throw new ArgumentException(); <-- Doesn't work either } catch (T tex) { Console.WriteLine("Caught passed in exception type"); } catch (Exception ex) { Console.WriteLine("Caught general exception"); } Console.Read(); } 

但是这总是会打印出“抓住一般exception”, catch(T tex)处理程序将永远不会工作。 不pipe我是抛出T()还是显式抛出ArgumentException()。 任何想法,为什么这是? 其实我有点惊讶,我甚至能够在catch语句中使用T,但是因为这可能不应该这样工作? 或者至less给一个编译器警告/错误,说这个处理程序将永远不会工作?

我的环境是Visual Studio 2008和3.5是目标框架。

更新:我现在直接从命令提示符尝试它,然后打印出“抓住exceptiontypes通过”。 所以它看起来像限于在Visual Studio中运行。 也许是Visual Studio托pipe过程的一个特点?

奇怪的行为在这里…

VS2k8控制台应用程序。 下列:

 try { throw new T(); } catch (T tex) { Console.WriteLine("Caught passed in exception type"); } catch (Exception ex) { Console.WriteLine("Caught general exception"); } 

导致“抓普通例外”

但是,从catch语句中删除(无用的)variables:

 try { throw new T(); } catch (T) { Console.WriteLine("Caught passed in exception type"); } catch (Exception) { Console.WriteLine("Caught general exception"); } 

导致“抓到exceptiontypes” !!!


更新

嘿嘿…它的一个错误: https ://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=362422&wa=wsignin1.0

资源? 这里。 为什么在安装Visual Studio 2008之后catch(TException)处理块行为在debugging器中有所不同?

它没有debugging工作

http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/0b0e5bc9-fab2-45b1-863b-40abae370475

丑陋的解决方法(你可以添加#if DEBUG):

  try { throw new T(); } catch (Exception dbgEx) { T ex = dbgEx as T; if (ex != null) { Console.WriteLine(ex.Message); } } 

看起来,在T和Exception之间进行select时,exception的最具体types是exception,因此调用处理程序。

我只是试过这个(你不能用C#或VB做,但是我编辑了IL),并且改变了第二个catch子句来捕获Object Ex而不是Exception Ex,在这种情况下,第一个处理器被击中了。

编辑

正如其他人所指出的那样,在debugging器中运行它比在特定types中运行更重要