继承和接口实现中的异常处理——异常去哪儿了?

对于异常的问题,是一个困扰了我很长时间的一个问题,异常在继承关系中是如何处理的,后来又发生了什么?网上有很多去讲解这个的文章,但是千篇一律,你抄我的我抄你得,我有自己的想法。今天有点时间就做了个实验。但是不管怎么样,运行期异常都是交给JVM虚拟机去处理了。这里只谈继承和实现的处理。

    首先是继承,子类的方法中有异常抛出,那么就必须要交给父类,我写了简单的一个方法,为了表现的更清楚,截了个图:


这个图只是表名了,如果异常中有继承关系,异常是一定要处理的,至于交给谁?请看下图:


对的,是交给他的爸爸!!这样孩子把自己处理不了的异常抛给了他的父类去处理,这也是我们创建对象的时候为什么尽量使用父类去创建。然后,最后交给线程或者main方法去处理,或者直接消化掉。

既然这样,那么接口呢?一样的,实现类会把异常交给接口,然后接口再去找main方法或者线程去处理,或者通过其他方法消灭掉,不多说,请看图:



提示的结果:





  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 MVC 和 WebApi ,我们可以通过实现统一异常处理来捕获应用程序异常并记录到数据库。这里介绍一种方法,使用 ILogger 接口实现日志记录。 1. 创建一个自定义异常处理器(CustomExceptionHandler),继承于 ExceptionHandler。 ```csharp public class CustomExceptionHandler : ExceptionHandler { public override void Handle(ExceptionHandlerContext context) { //将异常记录到数据库 var logger = context.RequestContext.Configuration.DependencyResolver.GetService(typeof(ILogger)) as ILogger; logger.LogException(context.Exception); //返回错误信息 context.Result = new ResponseMessageResult(context.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "An error occurred, please try again later.")); } } ``` 2. 在 WebApiConfig.cs 文件注册异常处理器。 ```csharp public static void Register(HttpConfiguration config) { //注册异常处理器 config.Services.Replace(typeof(IExceptionHandler), new CustomExceptionHandler()); //其他配置... } ``` 3. 创建一个 ILogger 接口实现类,用于将异常信息记录到数据库。 ```csharp public class DatabaseLogger : ILogger { private readonly IDbContext _dbContext; public DatabaseLogger(IDbContext dbContext) { _dbContext = dbContext; } public void LogException(Exception ex) { var log = new ExceptionLog() { Message = ex.Message, StackTrace = ex.StackTrace, InnerExceptionMessage = ex.InnerException?.Message, InnerExceptionStackTrace = ex.InnerException?.StackTrace, LogTime = DateTime.Now }; _dbContext.ExceptionLogs.Add(log); _dbContext.SaveChanges(); } } ``` 4. 在全局配置文件注册 ILogger 接口实现类。 ```csharp public class Global : HttpApplication { protected void Application_Start() { //注册 ILogger 接口实现类 var container = new UnityContainer(); container.RegisterType<IDbContext, MyDbContext>(); container.RegisterType<ILogger, DatabaseLogger>(); GlobalConfiguration.Configuration.DependencyResolver = new UnityResolver(container); //其他配置... } } ``` 通过以上步骤,我们就可以将应用程序异常统一记录到数据库了。需要注意的是,这里使用了 Unity 依赖注入框架,需要安装 Unity 包。另外,需要根据自己的数据库上下文(DbContext)和异常记录实体(ExceptionLog)进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值