为什么我不能在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工作
丑陋的解决方法(你可以添加#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中运行更重要