catch(异常),catch()和catch之间的区别

时间:2012-01-17 19:52:08

标签: .net exception-handling

我想知道我是否可以安全地编写catch()来捕获所有System.Exception类型。或者我必须坚持捕捉(例外)来实现这一目标。我知道其他异常类型(例如InvalidCastException),我必须将类型指定为catch(InvalidCastException)。换句话说,我问的是以下代码示例是否相同。

这......

try
{
    //do something
}
catch(Exception)
{
    //handle exception
}

这......

try
{
    //do something
}
catch() //Causes compile time error "A class type expected"
{
    //handle exception
}

这......

try
{
    //do something
}
catch
{
    //handle exception
}

更新:我的问题出错了。 c#中不允许catch()

5 个答案:

答案 0 :(得分:13)

在一个完美的世界中,你根本不应该使用catch(Exception)catch(单独),因为你永远不应该捕获泛型Exception例外。您总是应该捕获更具体的异常(例如InvalidOperationException ...等。)。

在现实世界中,catch(Exception)catch(单独)都是等价的。我建议您在计划仅重用异常变量时使用catch(Exception ex),而在其他情况下使用catch(单独)。只是第二个用例的风格问题,但如果个人觉得它更简单。

真正重要的是什么(即使它超出了您的问题范围)是您永远不会编写以下代码

try
{
}
catch (SpecificException ex)
{
    throw ex;
}

这会将堆栈跟踪重置为throw的点。另一方面:

try
{
}
catch (SpecificException)
{
    throw;
}

保持原始堆栈跟踪。

答案 1 :(得分:6)

这两个构造(catch ()是语法错误,正如sh4nx0r正确指出的那样)在C#中表现相同。两者都被允许的事实可能是从C ++语法继承的语言。

Others languages, including C++/CLI,可以throw个来自System.Exception的对象。在这些语言中,catch将处理这些非CLS例外,但catch (Exception)不会。

答案 2 :(得分:2)

catch(Exception ex)可以处理从System.Exception类派生的所有异常,但是如果抛出的异常不是从System.Exception派生的,那么catch(Exception ex)将不会处理它。

在.NET 3.0之前,由不安全代码抛出的异常(即代码未针对CLR)由catch{}处理。在.NET Framework 3.0之后,System.Exception类可以处理所有类型的异常。 catch{}现已过时。

答案 3 :(得分:1)

看一下这个链接: http://msdn.microsoft.com/en-gb/library/0yd65esw.aspx

我认为没关系,不管有没有但是你可以让语句catch中的参数获得你想要的正确异常并正确处理它们。

答案 4 :(得分:-1)

如果发生异常这一事实意味着您需要运行一段代码,但除非重新抛出异常,否则您不会对异常执行任何操作,否则首选方法可能不会捕获异常但是而是做类似的事情:

  bool ok=false;
  try
  {
    ... do stuff -- see note below about 'return'
    ok = true;
  }
  finally
  {
    if (!ok)
    {
      ... cleanup code here
    }
  }

这种模式的一个缺点是必须在ok = true;块内发生的任何return语句之前手动添加try(并确保不存在异常(除了ThreadAbortException之外)可以发生在ok = true;和返回之间。否则,如果一个人不会对异常做任何事情,那么就不应该抓住它。