[英]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.