-
侃侃尔雅
try{ //do something}catch{ //do something}无论异常如何,都会执行此捕获。try{ //do something}catch (Exception) { //do something}当抛出特定异常时执行此捕获try{ //do something}catch (Exception e) { //do something}同样在这里,只是你有一个对异常的引用。这样,您就可以访问它。在这里阅读更多。
-
慕村225694
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 exceptioncatch (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 异常的最佳实践
-
慕侠2389804
之间的细微差别: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 块并且您可以访问它 over e。catch (Exception e){ //some code;}如果您的代码抛出异常,则 catch 块将独立于异常类型抛出,您无权访问它。catch{ //some code;} 如果您的代码抛出异常,则将根据异常类型抛出 catch 块,并且您无权访问它。catch (Exception){ //some code;} 而不是Exception你应该使用更具体的异常类型!