Exception 带个when怎么回事?

这两个代码片段在功能上是等效的,但它们的实现方式略有不同。

### 第一个代码片段
```csharp
using System;

namespace ExceptionFilterDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                Console.WriteLine("Enter a number: ");
                int number = int.Parse(Console.ReadLine());

                // Intentionally cause a divide by zero exception
                int result = 100 / number;
                Console.WriteLine($"Result: {result}");
            }
            catch (DivideByZeroException ex) when (ex.Message.Contains("divide by zero"))
            {
                Console.WriteLine("Caught a divide by zero exception: Division by zero is not allowed.");
            }
            catch (FormatException ex) when (ex.Message.Contains("Input string was not in a correct format"))
            {
                Console.WriteLine("Caught a format exception: Please enter a valid number.");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Caught an unexpected exception: {ex.Message}");
            }
        }
    }
}
```

### 第二个代码片段
```csharp
using System;

namespace ExceptionFilterDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                Console.WriteLine("Enter a number: ");
                int number = int.Parse(Console.ReadLine());

                // Intentionally cause a divide by zero exception
                int result = 100 / number;
                Console.WriteLine($"Result: {result}");
            }
            catch (DivideByZeroException ex)
            {
                if (ex.Message.Contains("divide by zero"))
                {
                    Console.WriteLine("Caught a divide by zero exception: Division by zero is not allowed.");
                }
                else
                {
                    throw; // Re-throw the exception if the condition is not met
                }
            }
            catch (FormatException ex)
            {
                if (ex.Message.Contains("Input string was not in a correct format"))
                {
                    Console.WriteLine("Caught a format exception: Please enter a valid number.");
                }
                else
                {
                    throw; // Re-throw the exception if the condition is not met
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Caught an unexpected exception: {ex.Message}");
            }
        }
    }
}
```

### 比较

1. **异常过滤器 (`when` 子句)**:
   - 第一个代码片段使用了 C# 6.0 引入的异常过滤器 (`when` 子句),这使得异常处理更加简洁和直观。
   - 第二个代码片段使用了传统的 `if` 条件检查,并在条件不满足时重新抛出异常。

2. **代码简洁性**:
   - 第一个代码片段更简洁,因为它直接在 `catch` 语句中使用了 `when` 子句来过滤异常。
   - 第二个代码片段稍微冗长一些,因为它在 `catch` 块内部使用了 `if` 语句来检查条件,并在不满足条件时重新抛出异常。

3. **性能**:
   - 异常过滤器 (`when` 子句) 在性能上可能稍微优于传统的 `if` 检查,因为 `when` 子句在异常发生时会立即进行过滤,而不会进入 `catch` 块。

4. **可读性**:
   - 第一个代码片段的可读性更高,因为它直接在 `catch` 语句中表达了过滤条件。
   - 第二个代码片段的可读性稍差,因为它在 `catch` 块内部使用了 `if` 语句,并且需要重新抛出异常。

综上所述,虽然这两个代码片段在功能上是等效的,但第一个代码片段使用了更现代和简洁的异常过滤器语法,因此在可读性和简洁性上更胜一筹。

还是报错16:15:14.000 [http-nio-8989-exec-6] ERROR c.r.f.w.e.GlobalExceptionHandler - [handleRuntimeException,100] - 请求地址'/test/batchs/importExcel',发生未知异常. org.springframework.jdbc.BadSqlGrammarException: ### Error updating database. Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ELSE del_flag END, factory_id = CASE batch_id ' at line 72 ### The error may exist in file [D:\work\RuoYi-Vue\test\target\classes\mapper\test\BatchsMapper.xml] ### The error may involve com.ruoyi.test.mapper.BatchsMapper.batchUpdate-Inline ### The error occurred while setting parameters ### SQL: UPDATE batchs SET batch_name = CASE batch_id WHEN ? THEN ? WHEN ? THEN ? ELSE batch_name END, model_id = CASE batch_id WHEN ? THEN ? WHEN ? THEN ? ELSE model_id END, production_id = CASE batch_id WHEN ? THEN ? WHEN ? THEN ? ELSE production_id END, bom_id = CASE batch_id WHEN ? THEN ? WHEN ? THEN ? ELSE bom_id END, amounts = CASE batch_id WHEN ? THEN ? WHEN ? THEN ? ELSE amounts END, complete_amount = CASE batch_id WHEN ? THEN ? WHEN ? THEN ? ELSE complete_amount END, update_time = CASE batch_id WHEN ? THEN ? WHEN ? THEN ? ELSE update_time END, update_by = CASE batch_id WHEN ? THEN ? WHEN ? THEN ? ELSE update_by END, del_flag = CASE batch_id ELSE del_flag END, factory_id = CASE batch_id WHEN ? THEN ? WHEN ? THEN ? ELSE factory_id END WHERE batch_id IN ( ? , ? ) ### Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ELSE del_flag END, factory_id = CASE batch_id ' at line 72 ; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ELSE del_flag END, factory_id = CASE batch_id ' at line 72
最新发布
08-26
从你的错误日志来看,这是一个典型的 SQL 语法错误,具体发生在 `CASE` 表达式中。错误信息指出: ``` near 'ELSE del_flag END, factory_id = CASE batch_id ``` 说明 SQL 中的 `CASE` 语句格式不完整或有语法错误。 --- ### 分析错误原因 错误出现在如下类似的 SQL 语句中(伪代码): ```sql UPDATE batchs SET batch_name = CASE batch_id WHEN ? THEN ? ... ELSE batch_name END, del_flag = CASE batch_id -- 这里可能缺少 WHEN 子句 ELSE del_flag END WHERE batch_id IN (...) ``` 可以看到 `del_flag = CASE batch_id` 后面直接写 `ELSE`,没有 `WHEN ... THEN ...` 子句。虽然这在某些情况下是允许的(即所有情况都不满足时使用 `ELSE`),但结合上下文,可能是动态 SQL 构建时条件缺失导致语法错误。 --- ### 修复建议 #### ✅ 正确的 SQL 模板示例(用于批量更新) ```sql UPDATE batchs SET batch_name = CASE batch_id WHEN ? THEN ? WHEN ? THEN ? ELSE batch_name END, model_id = CASE batch_id WHEN ? THEN ? WHEN ? THEN ? ELSE model_id END, del_flag = CASE batch_id WHEN ? THEN ? WHEN ? THEN ? ELSE del_flag END WHERE batch_id IN (?, ?, ...) ``` #### ✅ MyBatis XML 示例(动态构建 CASE) ```xml <update id="batchUpdate"> UPDATE batchs SET batch_name = CASE batch_id <foreach collection="list" item="item"> WHEN #{item.batchId} THEN #{item.batchName} </foreach> ELSE batch_name END, model_id = CASE batch_id <foreach collection="list" item="item"> WHEN #{item.batchId} THEN #{item.modelId} </foreach> ELSE model_id END, del_flag = CASE batch_id <foreach collection="list" item="item"> WHEN #{item.batchId} THEN #{item.delFlag} </foreach> ELSE del_flag END WHERE batch_id IN <foreach collection="list" item="item" open="(" separator="," close=")"> #{item.batchId} </foreach> </update> ``` --- ### 可能的问题点总结 1. **没有 `WHEN` 子句**:`CASE batch_id` 后必须至少有一个 `WHEN ... THEN ...`。 2. **动态 SQL 构建失败**:如果 `list` 为空或者没有正确遍历,则 `<foreach>` 标签不生成内容,导致 `CASE` 缺少必要的 `WHEN`。 3. **字段值为 `null` 或空对象**:在构建 `WHEN` 时没有正确判断字段是否存在,导致 SQL 拼接错误。 --- ### 如何避免此类错误 - 使用 MyBatis 时,确保 `<foreach>` 能正确遍历非空集合。 - 对每个字段的更新逻辑进行判空处理,避免空值导致 SQL 构建异常。 - 在开发阶段启用 SQL 日志打印(如 `log4j` 或 `MyBatis-Log4j`),便于快速定位问题。 --- ### 示例 Java 实体类 ```java public class Batchs { private Long batchId; private String batchName; private Long modelId; private Integer delFlag; // 其他字段... } ``` --- ### 示例调用方式(Java) ```java List<Batchs> batchs = ...; // 初始化数据 sqlSession.update("batchUpdate", batchs); ``` --- ### ✅ 总结 你遇到的错误是由于 SQL 中的 `CASE` 语句缺少必要的 `WHEN` 子句导致的语法错误。解决方法是确保每个 `CASE` 都有至少一个 `WHEN ... THEN ...`,并使用 MyBatis 的 `<foreach>` 动态生成 SQL。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值