.Net中的含义是什么:try-catch块没有任何Exception作为catch的参数?
答案 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
语句。