.NET:异常处理的两条“黄金定律”,求批!
背景
架构之处必须考虑:如何处理异常?如何定义自己的异常体系?本文为了强化这个概念而写。
异常处理的两条“黄金定律”
自己抄袭的两条规律:
- 异常不能穿过“边界类”。
- 异常不能在没有恢复的情况下“吞掉”。
我们会将异常分为两类:“需要恢复”和“不需要恢复”,“需要恢复”的异常如果到达了边界类,就说明系统有BUG了,这类异常需要记录到日志。“不需要恢复”的异常需要进一步分为:“我们不能恢复”和“我们不期望恢复”,如果这类异常到达边界类,“我们不能恢复“的异常同样需要记录到日志,“我们不期望恢复”的异常则直接将异常信息显示给界面。一般采用AOP处理边界异常。
示例
AOP
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web.Mvc; using Common.Logging;
using Happy.ExceptionHanding;
using Happy.Web.Mvc.Newtonsoft; namespace Happy.Web.Mvc.ExceptionHanding
{
/// <summary>
/// 处理应用程序未捕获的异常。
/// </summary>
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = true)]
public class WriteExceptionResultAttribute : FilterAttribute, IExceptionFilter
{
/// <inheritdoc />
public void OnException(ExceptionContext filterContext)
{
var exception = filterContext.Exception;
if (!FriendlyExceptionRegistry.IsFriendly(exception.GetType()))
{
LogManager.GetCurrentClassLogger().Error(exception);
}
filterContext.Result = CreateErrorResult(exception);
filterContext.ExceptionHandled = true;
} private static ActionResult CreateErrorResult(Exception exception)
{
var information = ExceptionInformationProviderRegistry.CreateInformation(exception); return new NewtonsoftJsonResult
{
Data = information
};
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; using Happy.ExtentionMethods; namespace Happy.ExceptionHanding
{
/// <summary>
/// 异常信息提供者注册处。
/// </summary>
public static class ExceptionInformationProviderRegistry
{
private static readonly Dictionary<Type, IExceptionInformationProvider> _providers
= new Dictionary<Type, IExceptionInformationProvider>(); /// <summary>
/// 注册提供者。
/// </summary>
public static void Register<TException>(IExceptionInformationProvider provider)
where TException : Exception
{
Register(typeof(TException), provider);
} /// <summary>
/// 注册提供者。
/// </summary>
public static void Register(Type exceptionType, IExceptionInformationProvider provider)
{
exceptionType.MustNotNull("exceptionType");
provider.MustNotNull("provider"); _providers[exceptionType] = provider;
} public static Dictionary<string, object> CreateInformation(Exception exception)
{
exception.MustNotNull("exception"); var exceptionType = exception.GetType(); var information = CreateDefaultInformation(exception); if (_providers.ContainsKey(exceptionType))
{
var extInformation = _providers[exceptionType].CreateInformation(exception); foreach (var item in extInformation.ToDictionary())
{
information[item.Key] = item.Value;
}
}
else
{
if (FriendlyExceptionRegistry.IsFriendly(exception.GetType()))
{
information["exception"] = Resource.Messages.Msg_DefaultExceptionMessage;
}
} return information;
} private static Dictionary<string, object> CreateDefaultInformation(Exception exception)
{
return new Dictionary<string, object>
{
{ "success", false },
{ "exception", exception.GetType().Name },
{ "message",exception.Message }
};
}
}
}
备注
放弃继续玩 GO 的一个原因就是:GO 的异常处理太不爽了,或者是我自己的原因,不够 OPEN。
.NET:异常处理的两条“黄金定律”,求批!的更多相关文章
- 《转》前端性能优化----yahoo前端性能团队总结的35条黄金定律
除了自己总结:1. 减少http请求,2.压缩并优化js/css/image 3.尽量静态页面,从简原则 4.代码规范(详见:个人知识体系思维导图) 从yahoo 新学到的: 网页内容 减少http请 ...
- 前端性能优化----yahoo前端性能团队总结的35条黄金定律
转自 http://www.cnblogs.com/lei2007/archive/2013/08/16/3262897.html
- c编程:求出4×4矩阵中最大和最小元素值及其所在行下标和列下标,求出两条主对角线元素之和。
//求出4×4矩阵中最大和最小元素值及其所在行下标和列下标,求出两条主对角线元素之和 #include <stdio.h> int main() { int sum=0; int max, ...
- C++ 根据两点式方法求直线并求两条直线的交点
Line.h #pragma once //Microsoft Visual Studio 2015 Enterprise //根据两点式方法求直线,并求两条直线的交点 #include"B ...
- 求空间内两条直线的最近距离以及最近点的坐标(C++)
关键词:空间几何 用途:总有地方会用到吧 文章类型:C++函数展示 @Author:VShawn(singlex@foxmail.com) @Date:2016-11-19 @Lab: CvLab20 ...
- Intersecting Lines--POJ1269(判断两条直线的关系 && 求两条直线的交点)
http://poj.org/problem?id=1269 我今天才知道原来标准的浮点输出用%.2f 并不是%.2lf 所以wa了好几次 题目大意: 就给你两个线段 然后求这两个线段所在的 ...
- 全是干货!UI设计的30条黄金准则!
http://www.wex5.com/portfolio-items/js-1/ 全是干货!UI设计的30条黄金准则! 总的来说,好的UI界面有几个特征:简洁.便利.目标明确.人性化.字面上看这 ...
- 两条直线(蓝桥杯)二分枚举+RMQ
算法提高 两条直线 时间限制:1.0s 内存限制:256.0MB 问题描述 给定平面上n个点. 求两条直线,这两条直线互相垂直,而且它们与x轴的夹角为45度,并且n个点中离这两条 ...
- 判断两条直线的位置关系 POJ 1269 Intersecting Lines
两条直线可能有三种关系:1.共线 2.平行(不包括共线) 3.相交. 那给定两条直线怎么判断他们的位置关系呢.还是用到向量的叉积 例题:POJ 1269 题意:这道题是给定四个点p1, ...
随机推荐
- css如何将div画成三角形
首先了解一下盒模型: 盒模型 先看一段代码: #div1{ height: 100px; border-style: solid; border-width: 100px 100px 100px 10 ...
- 1、量化投资—为什么选择Python?
Python在量化领域的现状 就跟Java在web领域无可撼动的地位一样,Python也已经在金融量化投资领域占据了重要位置,从各个业务链条都能找到相应的框架实现. 在量化投资(证券和比特币)开源项目 ...
- hdu 1907(Nim博弈)
John Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Submis ...
- Android Webview中解决H5的音视频不能自动播放的问题
在开发webview的时候,当加载有声音的网页的时候,声音不会自动播放, 解决方法:在webview中调用js方法.这个方法需要在webview的setWebViewClient方法之后在onPage ...
- 【严蔚敏】【数据结构题集(C语言版)】1.17 求k阶斐波那契序列的第m项值的函数算法
已知k阶斐波那契序列的定义为 f(0)=0,f(1)=0,...f(k-2)=0,f(k-1)=1; f(n)=f(n-1)+f(n-2)+...+f(n-k),n=k,k+1,... 试编写求k阶斐 ...
- ceph笔记(一)
一.ceph概述本质上是rados:可靠的.自动的.分布式对象存储特性:高效性(大型的网络raid,性能无限接近raid).统一性(支持文件存储.块存储.对象存储).可扩展性数据库的一个弱点:查表ce ...
- poj1915 Knight Moves(BFS)
题目链接 http://poj.org/problem?id=1915 题意 输入正方形棋盘的边长.起点和终点的位置,给定棋子的走法,输出最少经过多少步可以从起点走到终点. 思路 经典bfs题目. 代 ...
- vars 变量预解析
JavaScript中,你可以在函数的任何位置声明多个var语句,并且它们就好像是在函数顶部声明一样发挥作用,这种行为称为 hoisting(悬置/置顶解析/预解析).当你使用了一个变量,然后不久在函 ...
- linux 使用
1. 请问怎样从文件里读内容到变量 var=(echo $(<aa)) ====>var=($(<aa)) $ var=($(<aa)) $ echo ${var[*]} /h ...
- 洛谷——P1349 广义斐波那契数列
题目描述 广义的斐波那契数列是指形如an=p*an-1+q*an-2的数列.今给定数列的两系数p和q,以及数列的最前两项a1和a2,另给出两个整数n和m,试求数列的第n项an除以m的余数. 输入输出格 ...