为了账号安全,请及时绑定邮箱和手机立即绑定

try-catch 中的不同捕获

try-catch 中的不同捕获

C#
开满天机 2022-01-09 15:33:36
这些类型的捕获有什么区别,除了首先我可以使用e?catch (Exception e){   //some code;}catch (Exception){   //some code;} catch{   //some code;} 
查看完整描述

4 回答

?
侃侃尔雅

TA贡献1801条经验 获得超16个赞

try{

    //do something

}catch{

    //do something

}

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


try{

    //do something

}catch (Exception) {

    //do something

}

当抛出特定异常时执行此捕获


try{

    //do something

}catch (Exception e) {

    //do something

}

同样在这里,只是你有一个对异常的引用。这样,您就可以访问它。


在这里阅读更多。


查看完整回答
反对 回复 2022-01-09
?
慕村225694

TA贡献1880条经验 获得超4个赞

Catch 可以捕获不同的异常类型。

当您使用语法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 异常的最佳实践


查看完整回答
反对 回复 2022-01-09
?
慕侠2389804

TA贡献1719条经验 获得超6个赞

之间的细微差别:


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; } 查看原始堆栈跟踪。


查看完整回答
反对 回复 2022-01-09
?
繁星淼淼

TA贡献1775条经验 获得超11个赞

如果您的代码抛出异常,则将抛出 catch 块并且您可以访问它 over e。


catch (Exception e)

{

   //some code;

}

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


catch

{

   //some code;

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


catch (Exception)

{

   //some code;

而不是Exception你应该使用更具体的异常类型!


查看完整回答
反对 回复 2022-01-09
  • 4 回答
  • 0 关注
  • 188 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信