Catch(对象o)如何工作?

时间:2009-12-04 00:06:38

标签: c#

我正在阅读Chris Brumme的博客,并列出了这段代码:

catch (object o) { .... }

虽然我读过的文章是关于一般异常处理(SEH和托管代码中的例外),但对此行没有完整的解释。

这条线如何运作?异常总是类型为Exception(或派生)?要捕获所有异常,只需省略括号及其内容或catch(异常x)即可。

由于

5 个答案:

答案 0 :(得分:2)

那不应该是合法的:

  

15.10 try语句

     

当catch子句指定类类型时,类型应为System.Exception或从System.Exception派生的类型。

类似地,C#允许您抛出的唯一内容是System.Exception类型的对象。

然而,

  

注意:某些环境(尤其是那些支持多种语言的环境)可能支持不能表示为从System.Exception派生的对象的异常,尽管C#代码永远不会生成此类异常。在这样的环境中,可以使用一般的catch子句来捕获这样的例外....

但是,一般的catch子句不会让你捕获对象。如果您只使用C#,那么如果我想对异常消息采取某些操作,或者将其记录在某处,我会使用catch (Exception e);当你真的不关心实际的异常值时,我会保存catch。如果您实际上依赖于一般的catch子句来捕获不是Exceptions的东西,那么您应该用注释来记录它。

答案 1 :(得分:2)

从框架2.0中捕获Object毫无意义。

之前您可以从非Exception类派生的非托管代码中获取异常,但是从框架2.0中,所有非托管异常都包含在从Exception派生的对象中,因此不再存在catch (Object o)或无参数catch的任何用途。

答案 2 :(得分:1)

首先,在大多数语言中来自Object的异常。

另外,根据语言,你可以扔东西;不仅仅是一个派生自Exception的对象。

这也可以让你抓住这些。

答案 3 :(得分:0)

异常继承自Object。

因此,该行将“起作用”(因为它捕获了所有异常),但它仍然不是很好的风格。

事实上,无论类型如何,捕获所有异常通常都是一个坏主意。

答案 4 :(得分:0)

异常是一个Object,它可以派生,但是catch对象必须是异常,并且不允许表达式(所以或者Execption或派生的Exception) 当异常被捕获时,它将执行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

用于自定义屏蔽:

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

}