繁体   English   中英

尝试接球中的不同接球

[英]Different catch in try-catch

这些捕获类型之间有什么区别,除了首先可以使用e

catch (Exception e)
{
   //some code;
}

catch (Exception)
{
   //some code;
} 

catch
{
   //some code;
} 

捕获可以捕获不同异常的类型。
当您使用语法catch(Exception)时 ,是在告诉编译器编写捕获任何类型的异常的代码,而如果您使用类似catch(InvalidOperationException)的语法,则要求捕获特定类型的异常。

为了简化操作,您可以编写不带任何类型的catch ,这与catch(Exception)的含义相同

try
{
    // Uncomment this line to catch the generic exception
    // throw new Exception("An exception occurred");

    throw new InvalidOperationException("Operation x is not valid in this context");
}
// Comment the following lines to fall into the generic catch exception
catch (InvalidOperationException)
{
    // But without the variable we cannot print out the message....
    Console.WriteLine("An invalid operation has been catched");
}
catch (Exception)
{
    Console.WriteLine("An exception raised");
}

您不能在未为相同类型的异常指定变量名称的同一个try catch中使用语法catch(Exception ex)

catch (Exception ex)
{
    Console.WriteLine(ex.Message);        
}
// Syntax error: CS0160: A previous catch clause already catches ......
catch (Exception)
{
    Console.WriteLine("An exception raised");
}

足够奇怪的是,这不会导致语法错误,但是会产生一个简单的警告

catch(Exception)
{
   ....
}
// Warning CS1058: A previous catch clause already catches ......
catch
{
   ....
}

当然,您不应该捕获不准备处理的异常。 如果这样做只是为了暴露信息,则可能会冒用程序正确功能的风险。 通常,您只捕获特定的异常,您知道该如何处理以允许程序继续运行。 我能够捕获所有异常的唯一原因是,当您在某种日志文件中记录了异常数据,然后再次抛出该异常时。

catch(Exception ex)
{
    Logger.Error("Unexpected exception", ex);
    throw;   // NEVER throw ex;
}

请记住,实际上从来不需要写throw ex,因为这样会松散异常的堆栈跟踪,并且很难精确地找到错误点。

请参阅: 捕获和重新抛出.NET异常的最佳实践

try{
    //do something
}catch{
    //do something
}

无论异常如何,都会执行此catch。

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

抛出特定异常时执行此catch

try{
    //do something
}catch (Exception e) {
    //do something
}

此处相同,只是您对异常的引用。 这样,您就可以访问它。

在这里阅读更多。

如果您的代码抛出异常,那么catch块将被抛出,您可以通过e访问它。

catch (Exception e)
{
   //some code;
}

如果您的代码引发异常,那么catch块将独立于异常类型而抛出,您无权访问它。

catch
{
   //some code;
} 

如果您的代码引发异常,则将根据异常类型引发catch块,并且您无权访问它。

catch (Exception)
{
   //some code;
} 

您应该使用更具体的异常类型来代替Exception

让我们检查

在此代码中,您可以编写e.Message来检查捕获消息

catch (Exception e)
{
Console.WriteLine("Error Message is : " + e.Message);
}

但是在此您只需跳过From Exception(All Exceptions),就可以添加更多的例外

    catch (sqlExcetion)
    {
    //if your code have sqlEsception Get here 
    }
    catch (Exception)
    {
    //if your code have any Exception Get here
    } 

在这段代码中,您可以创建一个catch,所有catch都可以

catch
{
   //all catch get here
} 

之间的微小区别:

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

try{
    //do something
}catch (Exception e) {
    //do something
}

是:(第二个将给出)

声明了变量“ e”,但从未使用过

另外,如果代码是这样的:

catch(Exception e) { throw e; }

原来的堆栈跟踪消失了。 因此,您必须执行以下操作: catch(Exception e) { throw; } catch(Exception e) { throw; }看到原来的堆栈跟踪。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM