异常执行顺序
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,整个方法会终止,后续的代码不执行。