C#的异常捕获处理

异常处理测试

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

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 }

 

posted @ 2024-09-12 10:29  IT苦行僧-QF  阅读(22)  评论(0编辑  收藏  举报