C# 捕获(对象o)是如何工作的?

C# 捕获(对象o)是如何工作的?,c#,C#,我正在读Chris Brumme的博客,下面列出了以下代码: catch (object o) { .... } 虽然我读的文章是关于一般异常处理(SEH和托管代码中的异常)的,但这一行没有完整的解释 上面那条线是怎么工作的?异常总是属于异常类型(或派生)?要捕获所有异常,只需省略括号及其内容或catch(异常x)即可 感谢从对象继承的异常 因此,该行将“工作”(因为它捕获所有异常),但它仍然不是好的样式 事实上,不管类型如何,捕获所有异常通常是一个坏主意。首先,在大多数语言中,异常都是从对象

我正在读Chris Brumme的博客,下面列出了以下代码:

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 !");

}