无参数捕获和其他捕获之间的区别

时间:2013-01-04 10:46:45

标签: c# exception exception-handling

我有一段代码

//Code 1                        Code 2                          Code 3
try                             try                             try
{                               {                               {
    //Exp occur                     //Exp occur                     //Exp occur 
}                               }                               }
catch (Exception e)             catch (Exception)               catch
{                               {                               {
    //Handle exp                    //Handle exp                    //Handle exp
}                               }                               }

所有三个代码之间有什么区别
PS 我是 C# 的新手,也是 Java Objective-C的新手关注此语法抛出错误

7 个答案:

答案 0 :(得分:8)

代码1

它在对象e中捕获异常,后来可以用于异常处理。例如,您可以使用e.Messagee.StackTrace

记录Message属性或查看堆栈跟踪

代码2

您正在捕获基类型Exception的所有异常,但由于您没有与之相关的任何对象,因此您只能抛出该异常以使其冒泡或您可以忽略该异常。如果在那段代码中你有:

catch(InvalidCastException)

然后,所有InvalidCastException将在块中处理,不包含异常对象

代码3

您正在捕获所有类型的异常,无论其类型如何,这类似于基类Exception的代码2

try-catch - MSDN

  

尽管可以在没有参数的情况下使用catch子句来捕获任何内容   异常类型,不建议使用此用法。一般来说,你   应该只捕获那些你知道如何从中恢复的异常。

如果在捕获基本异常之前捕获特定异常,它总是更好。就像是。

try
{
}
catch(InvalidCastException ex)
{
}
catch(Exception ex)
{
}

try - catch - MSDN

  

可以在同一个中使用多个特定的catch子句   try-catch语句。在这种情况下,catch子句的顺序是   很重要,因为捕获条款是按顺序检查的。抓住了   在不太具体的例外之前的更具体的例外。编译器   如果您订购了catch块以便稍后阻塞,则会产生错误   永远无法联系到。

答案 1 :(得分:3)

代码1 - 相当正常的捕获,希望不需要解释

代码2 - 您希望在发生特定异常时执行特定的代码,但您无意与异常对象进行实际交互。在最后几乎总是应该有一个throw;语句,以便那些在关注堆栈中的其他人可以catch。{/ p>

代码3 - 您希望代码执行任何异常(*)(除了同一catch的早期try子句捕获的代码之外。同样,应该几乎总是包含throw;,以便更高的代码可以catch并实际处理异常。

在某种程度上(可能只是在顶层,在未处理的异常处理程序中,对于你所处的任何环境),某些东西应该检查异常对象并可能记录它(如果可能的话) )。

答案 2 :(得分:2)

这里,如果你想使用变量'e'来获取Exception消息,Line或type。

//Code 1                       
try                            
{                              
 //Exp occur                
}                              
catch (Exception e)            
{                              
 //Handle exp               
}

下面的代码用于获取特定类型的Exception而不处理Exception变量。

//Code 2
try                            
{                              
  //Exp occur                
}                              
catch (Exception)
{                              
 //Handle exp           
}

以下代码捕获所有类型的异常。

//Code 3
try
{
 //Exp occur    
}     
catch 
{                  
 //Handle exp   
}

答案 3 :(得分:1)

如果您计划实际使用异常对象,将其属性记录到日志文件或显示消息框或抛出另一种异常并将当前异常传递给其构造函数,那么您必须使用第一个三个(最左边的一个)。

一般来说,最常用的方法是第一个,如果你想分别处理不同类型的异常,你可以有多个catch块从最专业的顶部开始,并且你在底部写的那个就是这样尚未处理的异常将以通用catch块结束。

答案 4 :(得分:1)

无。它们都捕获可能发生的每个异常(通过捕获基类型Exception或只是任何)。出于合理的原因,这通常是不受欢迎的。您应该按照预期的顺序捕获特定的异常,然后如果您确实希望捕获所有异常,请在最后捕获Exception

try
{
}
catch (MyCustomException)
{
    // do something for your custom exception
}
catch (Exception)
{
    // do something for everything else
}

为异常指定变量(例如catch (Exception e))时,您可以通过e.Propertye.ToString()访问堆栈跟踪(以及其他异常信息)以获取完整消息。在捕获异常时throw异常也是最好的做法(好吧,除非你想在这个级别压制它并且不允许你的调用代码看到异常)所以它会冒泡并保留堆栈跟踪:

catch (Exception e)
{
    // do something with e

    throw;
}

答案 5 :(得分:1)

代码1捕获每个异常(在您的情况下!)并声明它,因此您可以在以后使用它,例如对于错误消息。

MessageBox.Show(e.Message);

代码2也捕获每个异常(在你的情况下!),但你不能使用它,因为它没有被声明。

这两种方法并非专为此而设计,它们旨在捕获特定或自定义异常。

    try
    {
     //mycode
    }catch(MyException myExc)
    {   
    //TODO HERE  
    Console.Write(myExc.Message);  
    }

第三个捕获所有异常。因为没有定义。

看看:http://msdn.microsoft.com/de-de/library/0yd65esw%28v=vs.80%29.aspx

了解有关C#中的异常的更多信息。

答案 6 :(得分:1)

的差异:

  1. 声明异常参数ex 允许您访问Exception对象,以便查看和使用其属性,字段,方法等。这个“ex”变量的作用与任何方法中的任何参数一样。

  2. 声明不带参数ex 的异常类型允许您为不同类型的异常分隔多个“catch”区域。在此处定义代码示例3 时,它是无用的,功能相同,但是如果您需要根据异常的类型执行不同的操作,并且您不需要访问异常对象(你只需要知道异常的类型),这就是你要走的路。

  3. Untyped Catch Exception Handler 允许您为任何可能抛出的异常添加回退,无论其类型如何。但是,由于它未参数化,因此您将无法访问Exception对象的属性或方法。因此,代码示例2 代码示例3 都是等效的。

  4. 示例:

    try{ // code that throws exception }
    catch(TypeException ex) 
    { 
        // code to handle exceptions of type TypeException
        // I can access ex parameter, for example to show its Message property
        MessageBox.Show(ex.Message);
    }
    catch(OtherTypeException) 
    { 
        // code to handle exceptions of type OtherTypeException 
        // I cannot access the ex parameter since it is not declared, but I know
        // the exact type of the exception
        MessageBox.Show("There was an exception of Other Type");
    }
    catch
    {
        // code to handle any other exception
        // this is functionally equivalent to catch(Exception) since all typed exceptions
        // inherit from the base type Exception
        MessageBox.Show("An unknown exception has been thrown.");
    }
    ...