异常执行顺序

异常执行顺序

1

AccessViolationException异常触发后,下列程序的输出结果为:

复制代码
static void Main(string[] args)  
{  
    try  
    {  
        throw new AccessViolationException();  
        Console.WriteLine("error1");  
    }  
    catch (Exception e)  
    {  
        Console.WriteLine("error2");  
    }  
    Console.WriteLine("error3");  
} 
  • 结果:
    error2
    error3
    *解析:有异常后,跳过try中异常后的语句 catch捕获,然后继续往下执行。

异常配合try catch以及是否抛出问题解析

复制代码
// 外层代码
if (rulProjectConfig.getRelativeProject() == null) {
    if (sumc.compareTo(BigDecimal.ZERO) < 0 || cum.compareTo(BigDecimal.ZERO) < 0) {
        prpBatchPayourate.setCumPrem(oldPayOutRates.get(0).getCumPrem());
        // 调用邮件发送方法
        sendEmailNew(rulProjectConfig, 0.0f, 0.0f); 
        // 👇 这行代码会继续执行!
        prpBatchPayourate.setSumClaim(sumclaimNew);
    }
}
prpBatchPayourate.setDailyPayoutRate(0.0f); // 👇 这行也会执行!

public void sendEmailNew(参数...) {
    try {
        // 步骤1:准备邮件内容
        // 步骤2:调用邮件发送接口(这里抛出异常)
        // 步骤3:记录邮件发送成功日志 👉 这行代码不会执行!
    } catch (Exception e) {
        // 捕获异常,打印日志/记录异常
        log.error("邮件发送失败", e);
    }
    // 步骤4:方法末尾的代码 👉 这行代码会执行!
}

(1)sendEmail方法中出现异常

1:当 try 块中某一行抛出异常,该行后面的代码会立即停止执行,直接跳转到 catch 块;

2:catch 块执行完成后,会继续执行 catch 块之后、方法结束前的代码(比如步骤 4)。

(2)调用 sendEmailNew 的外层流程:不受影响,会继续执行

(3)反例:

如果 sendEmailNew 没捕获异常 / 主动抛异常

如果 sendEmailNew 是这样写的(异常未捕获 / 继续抛出):

复制代码
public void sendEmailNew(参数...) throws Exception { // 声明抛出异常
    // 邮件发送逻辑(抛异常)
}
// 或
public void sendEmailNew(参数...) {
    // 邮件发送逻辑(抛异常,但无try-catch)
}

此时外层流程会被中断:调用 sendEmailNew 的那一行会直接抛出异常,如果外层没有额外的 try-catch,整个方法会终止,后续的代码不执行。

简单记:异常被 catch 抓住 = 局部 "灭火",不影响外部;没抓住 = 火势蔓延,中断流程。

相关推荐
guodingdingh37 分钟前
软件开发工作问题总结0718
java·开发语言·数据库
咖啡八杯2 小时前
GoF设计模式——解释器模式
java·后端·spring·设计模式
优橙教育2 小时前
5G网优培训 vs Java开发:转行选哪个?
java·开发语言·5g
糖果店的幽灵3 小时前
【DeepAgents 从入门到精通】Context Management 上下文管理
java·人工智能·后端·spring·中间件·langgraph·deepagents
腻害兔4 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:字典、短信、邮件、通知——后台系统的“基础设施四件套“!
java·前端·vue.js·产品经理·ai编程
碎光拾影5 小时前
ARM交叉工具链各工具作用及IMX6ULL平台LED+蜂鸣器裸机程序实现
java·开发语言·数据库
一叶龙洲5 小时前
wslg打开Ubuntu24.04默认打开图形界面
linux·服务器·数据库·ubuntu
Miao121316 小时前
微服务 API 测试实践:海外某民宿平台如何构建模式驱动测试基础设施
java·开发语言
腻害兔6 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:支付模块 yudao-module-pay,一个让产品经理都看懂的支付中台设计
java·前端·vue.js·产品经理·ai编程
敖行客 Allthinker7 小时前
Parallels Ubuntu虚拟机项目如何让手机访问?完整解决方案
linux·运维·ubuntu