C# 捕获(对象o)是如何工作的?
我正在读Chris Brumme的博客,下面列出了以下代码:C# 捕获(对象o)是如何工作的?,c#,C#,我正在读Chris Brumme的博客,下面列出了以下代码: catch (object o) { .... } 虽然我读的文章是关于一般异常处理(SEH和托管代码中的异常)的,但这一行没有完整的解释 上面那条线是怎么工作的?异常总是属于异常类型(或派生)?要捕获所有异常,只需省略括号及其内容或catch(异常x)即可 感谢从对象继承的异常 因此,该行将“工作”(因为它捕获所有异常),但它仍然不是好的样式 事实上,不管类型如何,捕获所有异常通常是一个坏主意。首先,在大多数语言中,异常都是从对象
catch (object o) { .... }
虽然我读的文章是关于一般异常处理(SEH和托管代码中的异常)的,但这一行没有完整的解释
上面那条线是怎么工作的?异常总是属于异常类型(或派生)?要捕获所有异常,只需省略括号及其内容或catch(异常x)即可
感谢从对象继承的异常 因此,该行将“工作”(因为它捕获所有异常),但它仍然不是好的样式
事实上,不管类型如何,捕获所有异常通常是一个坏主意。首先,在大多数语言中,异常都是从对象获取的 而且,根据语言的不同,你可以扔任何东西;不仅仅是从异常派生的对象
这也会让你抓到这些东西。这不应该是合法的: 15.10 try声明 当catch子句指定类类型时,该类型应为System.Exception或从System.Exception派生的类型 类似地,C#允许您抛出的唯一对象是System.Exception类型的对象 但是, 注意:某些环境,特别是支持多种语言的环境,可能支持不能表示为从System.Exception派生的对象的异常,尽管这种异常永远不会由C#代码生成。在这样的环境中,可以使用通用catch子句来捕获这样的异常
但是,general catch子句不允许捕捉对象。如果您只使用C#,那么如果我想对异常消息采取一些操作,或者将其记录到某个地方,我将使用
catch(Exception e)
;我会保存catch
以备您真正不关心实际异常值时使用。如果您实际上依赖于general catch子句来捕获非异常的内容,则应使用注释对其进行记录。从framework 2.0捕获对象是毫无意义的
早些时候,您可以从非托管代码中获取一个异常,该异常不是从exception
类派生的,而是从framework 2.0中,所有非托管异常都包装在从exception
派生的对象中,因此不再使用catch(对象o)
或无参数的catch
异常是一个对象,可以派生,但catch对象必须是一个异常,并且不允许使用表达式(so或Execption或是异常的派生)
当异常被cathed时,它将在catch内执行代码,并在这个范围内定义异常对象。
如果你不放代码,什么都不会附加。
!注意,如果放置派生类型,则仅当trhow execption获得此类型时,catch才会工作
范例
//BLOCK ANYTHING
try
{
...do something..
}
catch
{
}
//OR
try
{
...do something..
}
catch(Exception ex)
{
...do something else..
}
<---- Here the variable ex is not defined
这会编译吗?对我来说不是。如果你想记录异常,捕获所有异常是很好的。尽管通常最好使用页面错误或应用程序错误事件,并将其捕获为未处理的异常。捕获所有异常!=捕捉对象
老实说,我看到它在C#中经常被滥用,相当于“出错后继续下一步”。非常可怕。如果你重新抛出捕获的异常,那么它就很好。应该注意的是,尽管C语言不允许你抛出任何不从<代码>异常< /代码>中派生的任何东西,但是CLR本身不具有这样的限制,并且允许你抛出任何引用类型的实例(C++等)。这其中涉及到一些CLR魔术,它将自动包装此类非异常
派生的实例,用于无法使用它们的代码,但是请参阅MSDN中RuntimeWrappedException
类的文档。这适用于任何C#编译的程序集,因此即使C#允许您捕获(对象)
,也不会有任何非从异常
派生的情况。
class MyException : Exception
{
...bla bla...
}
class OtherEx: notImplementedException
{
...foo foo..
}
try
{
}
catch(MyException ex)
{
Console.WriteLine("Is mine !");
}
catch(OtherEx ex)
{
Console.WriteLine("Is other !");
}
catch(Exeception ex)
{
Console.WriteLine("Is anything else !");
}