除了首先可以使用e
以外,这两种捕获方式之间有什么区别?
catch (Exception e)
{
//some code;
}
catch (Exception)
{
//some code;
}
catch
{
//some code;
}
答案 0 :(得分:1)
捕获可以捕获不同异常类型。
当您使用语法 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");
}
您不能在未为同一类型的异常指定变量名称的同一尝试捕获中使用语法 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 ,因为这样会使您松开异常的堆栈跟踪信息,并且很难精确地找到错误点。
请参阅:Best practices for catching and re-throwing .NET exceptions
答案 1 :(得分:1)
try{
//do something
}catch{
//do something
}
无论是否发生异常,都会执行此catch。
try{
//do something
}catch (Exception) {
//do something
}
抛出特定异常时执行该catch
try{
//do something
}catch (Exception e) {
//do something
}
与此处相同,只是您对Exception的引用。这样,您就可以访问它。
了解更多here。
答案 2 :(得分:0)
如果您的代码引发异常,则将抛出catch块,并且您可以通过e
访问它。
catch (Exception e)
{
//some code;
}
如果您的代码引发异常,则catch块将与异常类型无关地抛出,并且您无权访问它。
catch
{
//some code;
}
如果您的代码引发异常,则将根据异常类型抛出catch块,您将无权对其进行访问。
catch (Exception)
{
//some code;
}
您应该使用更具体的异常类型来代替Exception
!
答案 3 :(得分:0)
让我们支票
在此代码中,您可以编写e.Message进行检查捕获消息
catch (Exception e)
{
Console.WriteLine("Error Message is : " + e.Message);
}
但是在此,您只需跳过From Exception(所有异常),然后可以添加更多Exception
catch (sqlExcetion)
{
//if your code have sqlEsception Get here
}
catch (Exception)
{
//if your code have any Exception Get here
}
在此代码中,您可以创建一个捕获,所有捕获都可以实现
catch
{
//all catch get here
}
答案 4 :(得分:0)
之间的细微差别:
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; }
查看原始的堆栈跟踪。