C#中抛出异常后如何继续执行代码?如何修改示例代码实现运行不中断?
C# 中throw关键字的设计目的就是中断当前执行流,向上层调用栈抛出异常,如果希望触发错误条件后程序不中断运行,有两种常见的改造方案:
方案1:保留抛出异常逻辑,在上层调用处添加try-catch捕获
如果业务要求必须抛出异常(比如需要上层统一处理错误日志、事件上报等),只需要在调用这段代码的外层包裹try-catch块,捕获异常后完成错误处理即可不中断后续代码执行,适合批量处理等场景,单条数据出错不会影响后续其他任务运行。
示例代码:
// 原有校验逻辑封装为方法 void CheckStringValid(string str) { if (str is null || str == string.Empty) { throw new Exception("Wrong str"); } // 校验通过后的业务逻辑 Console.WriteLine("字符串校验通过"); } // 上层调用逻辑 void BatchProcessTask() { List<string> toProcessStrs = new List<string> { "", "test1", null, "test2" }; foreach (var str in toProcessStrs) { try { CheckStringValid(str); // 校验通过后需要执行的其他业务代码 } catch (Exception ex) { // 捕获异常后完成错误处理,比如记录日志 Console.WriteLine($"处理出错:{ex.Message}"); } // 无论是否抛出异常,此处及后续的代码都会正常执行 } }
方案2:取消抛出异常,改用错误标识/日志记录代替
如果没有必须抛出异常的强制要求,这种方案更符合开发规范:异常本身是用来处理不可预期的运行时错误的,可预期的参数校验错误完全可以用返回值或者日志处理,不需要抛出异常中断流程。
改造后的代码:
if (str is null || str == string.Empty) { // 直接记录错误日志,不抛出异常 Console.WriteLine("Wrong str"); // 如果是方法内的校验,也可以返回错误标识方便上层判断处理 // return false; } // 后续代码会直接继续执行
注意:不要在没有上层捕获的场景下直接抛出异常,否则程序必然会中断执行。如果是全局场景不想让异常中断程序,也可以注册全局异常捕获事件做兜底处理,但这种方式只适合做未处理异常的兜底,不推荐用来处理常规的业务校验错误。
内容的提问来源于stack exchange,提问作者Ladislav
相关产品推荐
相关产品推荐

