我正在对代码进行一些单元测试,这可能会根据输入引发许多异常.所以我尝试了类似下面的代码:(简化示例)
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();
}
Run Code Online (Sandbox Code Playgroud)
但是这将始终打印出"抓住一般异常",catch(T tex)处理程序永远不会工作.无论我抛出T()还是显式抛出ArgumentException()都没关系.任何想法为什么会这样?实际上我有点惊讶我甚至能够在catch子句中使用T,但是因为那可能不应该这样做吗?或者至少给出一个编译器警告/错误,说明这个处理程序永远不会工作?
我的环境是Visual Studio 2008,3.5是目标框架.
更新:我现在直接从命令提示符尝试它,然后打印出"Caught传递异常类型".因此看起来这仅限于在Visual Studio中运行.也许Visual Studio托管过程的特殊性?