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
事务回滚。
四、结论和说明
- 在try里面的异常,可以catch,catch后按照代码处理。在try之外的异常捕获不到。
- Try-catch中如果catch中直接throw,和没有try-catch一样,多的是可以打日志。
- 应用层异常只考虑有数据库操作后,如果数据库操作前,不影响对数据库的影响,不作为测试方面。
- 领域层的事务回滚可以回滚对应的数据库处理。
- 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 }