在.Net中是什么意思:try-catch块没有任何Exception作为catch的参数?

时间:2010-02-18 11:08:22

标签: .net exception try-catch

.Net中的含义是什么:try-catch块没有任何Exception作为catch的参数?

9 个答案:

答案 0 :(得分:10)

它与catch (Exception ex)几乎相同,如果你没有使用非托管调用,因为.NET中的所有异常都来自Exception类。当您在Exception块中不需要catch的实例时,可以使用它。但是catch没有Exception作为参数也会捕获非托管异常,因为在其他非托管语言中,异常可能不会从Exception类派生。

答案 1 :(得分:4)

这意味着catch块将捕获任何异常。

这也意味着您无法对异常对象执行任何操作,因为您没有对它的引用。

如果你真的不关心任何出现的事情(并且不想对它做任何事情),你可以使用这种模式,但通常你应该避免这种风格。

答案 2 :(得分:4)

这意味着您正在尝试捕获非CLS兼容的异常。

据我所知,在CLR的2.0版本中,当符合非CLS标准时 抛出异常,CLR自动构造RuntimeWrapped的实例 - 异常类并初始化其私有字段以引用实际抛出的对象。 实际上,CLR现在将所有符合CLS的异常转换为符合CLS的异常。

答案 3 :(得分:2)

它捕获所有可捕获的异常。这通常是一个坏主意。

答案 4 :(得分:1)

它将捕获所有异常,但您将无法访问catch块中的异常对象。

这对于在重新投掷之前对任何错误执行某些操作非常有用。

答案 5 :(得分:1)

有两种类型的异常:符合CLS,派生自Exception类和非CLS兼容(当任何对象可以抛出时 - Int32,DateTime等)。毫无异常的catch子句在.net框架2.0之前用于捕获非CLS兼容的异常,但现在它们被捕获并包含在RuntimeWrappedException中,其中属性WrappedException指向抛出的对象。这就是为什么在较新版本的框架中应避免使用此类代码的原因。

答案 6 :(得分:1)

首先,一个小小的前言。 CLR允许将任何类型的实例作为异常抛出;例如,可以抛出System.String甚至System.Windows.Forms.Form对象。但是,C#编译器只允许抛出Exception派生的对象。因此,捕获非CLS兼容异常的唯一方法是在代码中使用空catch()块。

在CLR版本2.0之前,非空的catch块(即catch (Exception ...))仅捕获符合CLS的异常。但是在CLR的2.0版本中,Microsoft引入了一个新的RuntimeWrappedException类,以便在不符合CLS的情况下 抛出异常(例如,从另一种语言),CLR自动构造RuntimeWrappedException类的实例。从那时起,就不再需要空的catch块(即catch()),因为catch (Exception )无论如何都会捕获所有异常。

希望这会有所启发。

如需了解更多信息,我可以向您致谢Jefrey Richter的精彩书籍“CLR via C#”,第3版现已发售。

答案 7 :(得分:0)

尽管可以在没有参数的情况下使用catch子句来捕获捕获任何类型的异常,但不建议使用此用法。通常,您应该只捕获那些您知道如何从中恢复的异常。因此,您应始终指定派生自System .. ::。Exception

的对象参数

答案 8 :(得分:0)

它捕获每个异常,并且您无权访问异常实例本身。对我来说,这看起来通常像代码味道(有一些特殊的情况,这可以认为是好的)

我一直认为它类似于VB中的On Error Resume Next语句。