首页 > 编程语言 >C#的异常捕获处理

C#的异常捕获处理

时间:2024-09-12 10:24:56浏览次数:1  
标签:回滚 C# 捕获 手动 事务 try catch 异常 应用层

异常处理测试

一、领域层异常,应用层无异常

1. 领域层try-catch,不手动回滚,应用层无

事务正常提交,已经处理的数据会提交到数据库。没有异常捕获!

 

2. 领域层try-catch,不手动回滚,应用层try-catch,不手动回滚

事务正常提交,已经处理的数据会提交到数据库。没有异常捕获!不会进应用层的catch!

3. 领域层try-catch,不手动回滚,应用层try-catch,手动回滚

事务正常提交,已经处理的数据会提交到数据库。没有异常捕获!不会进应用的catch!

4. 领域层try-catch,手动回滚,应用层无

事务回滚。

 

5. 领域层try-catch,手动回滚,应用层try-catch,不手动回滚

事务回滚,不会进应用层catch!

6. 领域层try-catch,手动回滚,应用层try-catch,手动回滚

事务回滚,不会进应用层catch!

7. 领域层无,应用层无

事务回滚。

 

8. 领域层无,应用层try-catch,不手动回滚

程序代码异常:可以正常捕获

事务正常提交,已经处理的数据会提交到数据库。

事务提交时异常:无法捕获

事务回滚。

9. 领域层无,应用层try-catch,手动回滚

程序代码异常:可以正常捕获

事务回滚。

 

10. 领域层try-catch-throw,应用层try-catch-throw

事务回滚。

二、领域层异常,应用层异常

1. 领域层try-catch,不手动回滚,应用层无

事务回滚。

2. 领域层try-catch,不手动回滚,应用层try-catch,不手动回滚

程序代码异常:可以正常捕获

事务正常提交,已经处理的数据会提交到数据库。

3. 领域层try-catch,不手动回滚,应用层try-catch,手动回滚

程序代码异常:可以正常捕获

事务回滚。

4. 领域层try-catch,手动回滚,应用层无

事务回滚。

5. 领域层try-catch,手动回滚,应用层try-catch,不手动回滚

程序代码异常:可以正常捕获

事务回滚。

6. 领域层try-catch,手动回滚,应用层try-catch,手动回滚

程序代码异常:可以正常捕获

事务回滚。

7. 领域层无,应用层无

事务回滚。

8. 领域层无,应用层try-catch,不手动回滚

程序代码异常:可以正常捕获

事务正常提交,已经处理的数据会提交到数据库。

9. 领域层无,应用层try-catch,手动回滚

程序代码异常:可以正常捕获

事务回滚。

10. 领域层try-catch-throw,应用层try-catch-throw

事务回滚。

三、应用层异常,领域层无异常

1. 领域层无,应用层无

事务回滚。

2. 领域层无,应用层try-catch,不手动回滚

程序代码异常:可以正常捕获

事务正常提交,已经处理的数据会提交到数据库。

3. 领域层无,应用层try-catch,手动回滚

程序代码异常:可以正常捕获

事务回滚。

4. 领域层try-catch-throw,应用层try-catch-throw

事务回滚。

四、结论和说明

  1. 在try里面的异常,可以catch,catch后按照代码处理。在try之外的异常捕获不到。
  2. Try-catch中如果catch中直接throw,和没有try-catch一样,多的是可以打日志。
  3. 应用层异常只考虑有数据库操作后,如果数据库操作前,不影响对数据库的影响,不作为测试方面。
  4. 领域层的事务回滚可以回滚对应的数据库处理。
  5. Try中的异常,需要在catch中回滚,捕获不到的会回滚。

 测试代码:

 1    public async Task InsertInboundOrderAsync(InboundOrder inboundOrder, List<InboundOrderLine> inboundOrderLine)
 2    {
 3        try
 4        {
 5            await _inboundOrder.InsertAsync(inboundOrder);
 6            inboundOrderLine.ForEach(x => x.InboundOrderId = inboundOrder.Id);
 7            int t = 0;
 8            var a = 1 / t;
 9            await _inboundOrderLine.InsertManyAsync(inboundOrderLine);
10        }
11        catch (Exception ex)
12        {
13            Log.Information("有异常...");
14            await _unitOfWorkManager.Current.RollbackAsync();
15        }
16    }
 1 [HttpPost]
 2 public async Task<ApiData> InsertInboundOrderInfo(InsertInboundOrderInput insertInboundOrderInput)
 3 {
 4     try
 5     {
 6         var inboundOrder = new InboundOrder
 7         {
 8             InboundOrderCode = await _appSequenceManager.GetInboundOrderCodeAsync(),
 9             Ctime = DateTime.Now,
10             Cuser = "8.领域层无,应用层try-catch,不手动回滚",
11             Mtime = DateTime.Now,
12             BusinessType = insertInboundOrderInput.BusinessType,
13             BusinessOrderCode = insertInboundOrderInput.BusinessOrderCode,
14             OrderStatus = 0,
15             FreezeStatus = false
16         };
17         List<InboundOrderLine> inboundOrderLines = new List<InboundOrderLine>();
18         foreach (var line in insertInboundOrderInput.Lines)
19         {
20             //增加物料是否存在判断 TODO
21 
22             inboundOrderLines.Add(new InboundOrderLine
23             {
24                 QuantityExpected = line.QuantityExpected,
25                 Comment = line.Comment,
26                 Uom = line.Uom,
27                 ProductCode = line.ProductCode,
28                 WmsBaseProductId = 1
29             });
30         }
31         await _testManager.InsertInboundOrderAsync(inboundOrder, inboundOrderLines);
32         int t = 0;
33         var a = 1 / t;
34         return _apiDataManager.Success();
35     }
36     catch (Exception ex)
37     {
38         Log.Information(ex.Message);
39         Log.Information("事务处理判断...");
40         if (_unitOfWorkManager.Current != null)
41         {
42             if (
43             System.Transactions.Transaction.Current != null &&
44                 System.Transactions.Transaction.Current.TransactionInformation.Status == System.Transactions.TransactionStatus.Active)
45             {
46                 Log.Information("系统判断有事务");
47             }
48             Log.Information("有事务需要回滚");
49             await _unitOfWorkManager.Current.RollbackAsync();
50         }
51         return _apiDataManager.Failure(ex.Message);
52     }
53 }

 

标签:回滚,C#,捕获,手动,事务,try,catch,异常,应用层
From: https://www.cnblogs.com/liuqifeng/p/18409677

相关文章

  • CSS样式
    下列笔记均是来自尚硅谷张天禹的上课内容。1样式写的位置1.1行内(不推荐) 1.2内部1.3外部 1.4优先级 2css语法规范3选择器3.1 通配选择器常用于清除q样式3.2元素选择器 3.3类选择器  3.4id选择器3.5总结 3.6交集选择器3.7并集......
  • 2024年9月上海、成都、深圳CDAM数据资产管理师认证招生
    人工智能与信息浪潮中,数据资源作为企业发展的核心要素,其可重组利用的无形价值显著。数据安全、利用、价值评估等工作,均关乎企业未来决策与发展。数据资产,是企业持续发展的关键因素。 在此背景下,CDAM数据资产管理师应运而生,他们在组织中担当数据资产的规划师、治理者、质控者、安全......
  • 2024年9月上海、南京、深圳CDGA/CDGP数据治理认证报名
    DAMA认证中的CDGA和CDGP是数据管理领域的专业认证之路。通过这两个认证,个人可以提升自己在数据管理领域的专业水平和能力,为企业的发展贡献自己的力量。同时,企业也可以通过选拔和培养具备DAMA认证的数据管理人才,提升自身的数据管理能力,推动企业数字化转型和升级。【认证含金量】·数......
  • PbootCms内页打不开的常见情况汇总
    当遇到PBootCMS内页无法正常访问的情况时,特别是当点击任何链接都跳转到首页或内页访问报错时,通常与伪静态配置有关。以下是最简单粗暴的方案——关闭伪静态,使用兼容模式的操作步骤:1.关闭伪静态步骤1:修改全局设置登录PBootCMS后台。导航到“全局设置”。找到“URL模式”......
  • 【PCB工艺】如何实现PCB板层间的互连
    系列文章目录1.元件基础2.电路设计3.PCB设计4.元件焊接5.板子调试6.程序设计7.算法学习8.编写exe9.检测标准10.项目举例11.职业规划文章目录前言①、什么是通孔②、通孔是怎样产生的③、通孔种类④、盘中孔⑤、设计建议前言送给大学毕业后找不......
  • springboot一个ACG主题网站-计算机毕业设计源码94119
    目录摘要1绪论1.1选题背景与意义1.2国内外研究现状1.3论文结构与章节安排2网站分析2.1可行性分析2.2网站流程分析2.2.1网站开发流程2.2.2用户登录流程2.2.3网站操作流程2.2.4添加信息流程2.2.5修改信息流程2.2.6删除信息流程2.3 网站......
  • 信号发生器在扫描模式下输出正弦波信号,示波器呈现的波形显示异常与不理想,这是为什么
    如下图所示,在信号发生器扫描模式下输出正弦波信号,示波器呈现出的波形显示“异常”“不理想”情况,其原因可能与以下因素有关:1、扫描速度与示波器刷新率不匹配如果信号发生器的扫描速率(频率变化速度)与示波器的时间基准或刷新率不同步,示波器可能无法正确显示动态变化的频率信号......
  • 第50课 Scratch入门篇:放烟花
    放烟花故事背景: 水在一个宁静的小镇上,生活着一位充满好奇心和创造力的小朋友。 有一天晚上,小镇的天空格外黑暗,星星也躲在了云层后面。小朋友望着黑漆漆的夜空,心想:要是能有一场绚丽的烟花表演,那该多好啊!于是,他决定用自己所学的Scratch编程知识来创造一场属于自己的......
  • 【有奖征文】华为云 CodeArts,AI 重塑的软件开发生产线!
    华为云软件开发生产线CodeArts是一站式、全流程、安全可信的DevSecOps平台,内置华为三十年研发最佳实践,助力效能倍增和数字化转型,支持Web开发、移动应用开发、微服务开发、CloudNative应用开发等典型研发场景,覆盖需求、开发、测试、部署等软件交付全生命周期环节,为开发......
  • 14-spring cache 学习
    SpringCache介绍SpringCache是一个框架,实现了基于注解的缓存功能,只需要简单地加一个注解,就能实现缓存功能。SpringCahce提供了一层抽象,底层可以切换不同的cache实现,具体就是通过CacheManager接口来统一不同的缓存技术。CacheManager是Spring提供的各种缓存技术抽象......