异常处理—Exception(三)
最近有点事,把这个系列给落下了,给大家道个歉,这里还要感谢我的老婆,谢谢她一直对我的支持:)
系列回顾:
上一篇中主要介绍了Log的几种方式,接下来说说通知的方式:
通知方式 |
说明 |
|
这是最常见也是最方便的一种通知方式。 优点:使用简单 缺点:需要依赖于SMTP服务器等 |
SMS |
这也是目前比较流行的通知方式,不过一般不会把所有信息都通过短信进行发送,可以选几个比较关键的Exception进行SMS通知。 缺点:字数、网关、接口等限制。 优点:及时性 |
Post |
通过某种服务,对客户端进行Post Exception。 优点:及时性(不过依赖于客户端) 缺点:需要编写安全的客户端程序。 |
Get |
跟Post优点类似,但需要把Exception先存到某个地方,然后Get的时候获取。 |
Other |
还有很多通知的方式,这个取决于大家的需求了。 |
一般我们常用的是前2种方式,因为编写还算简单,SMS的接口现在也有很多了。
注:如果在你的程序种有Email发送程序的话,我建议您还是不要使用相同的配置进行发送,建议重新建立一个新的配置,包括发送方式都使用一个新的方法。
这里值得注意的是,当你的Email通知方式抛出异常时,请一定要使用另外一种方式进行通知,因为此时可能你的网站已经发生了不可忽视的异常了。
通知的信息内容比较简单,如果是Email发送方式,就可以使用Log的Log信息进行发送,如果SMS的话,你可以使用模板,或者固定格式进行发送。
通知的内容不是很多,下面来讨论一下 Try / Catch
这个问题本来先前就想说的,前几天也看到杨兄弟的“请讨论try...catch..写在不同地方,有何利害? ”其中讨论的非常激励,很多人说的都比较正确,使我觉得或许我的方案不是最好的,但我决定还是把我的看法写出来,这样才能大家一起来进行讨论。老赵说在内部类的时候最好也能把异常捕捉后,进行封装然后再抛出,不过我个人觉得,如果是类库的话,还是不要去Catch,这是为什么呢?
我认为,类库中的方法是我们程序的最小单元,它的存在是为了我们高层的调用,它的存在必有它的意义,就算它内部调用其他类库的方法(大多会调用FCL),我们最好不要去Catch掉,不过某些时候你可能要违反这个规则,但请记住,封装好你的异常,然后Throw到高层,那样才能不遗漏你的程序发生的Exception。类库中的方法,如果会调用很多其他类库的方法时,你应该考虑你的这个类库或许已经存在了几种可能性改变你的结果了,你该好好的重新设计你的方法。
现在说说我的观点,一般我们的网站会使用三层架构,不过为了解除业务逻辑与页面层的耦合,我们会借助某些模式,以降低它的耦合度。(自己的想法,或许某些概念会错误)
我们的网站大多是对数据库的I、U、D、S的操作,所以数据层基本已经属于了底层类库,业务层进行调用,UI层进行显示信息。(那我们是不是对数据层的异常不进行处理呢?也不一定,如果按照我先前说的,最好是不要在底层进行处理,没有错,但我们不能太绝对,还是根据你的项目来分析后进行安排吧。)
有人会说在数据层,我们会使用ADO等方法,会与数据库进行一定的联系,其中就会抛出各种异常,难道我们不要去处理吗?是的,如果可能,请不要在这里进行处理,我的方案是,去业务层进行捕捉和处理。
业务层我们是不是去把所有异常都处理了呢?请不要这样设想,因为有些异常不是你能全部处理的,我们应该把我们能预知的,我们需要的异常进行处理(姑且把我们的处理程序定义为ExceptionManager)丢到ExceptionManager中进行处理。但我们有时需要抛出一些Exception Message给用户,所以这些异常,请封装好,继续往高层Throw,这时,请不要把异常丢到ExceptionManager中,因为后面我们会有其他地方进行处理的。
到此,轮到我们的UI层了,UI层直接面对的是用户,在我们先前说的,我们必须记录下我们的异常,让后给用户呈现一个友好的用户界面,那样才是做网站的王道。在web.config中,可以设置发生错误时所呈现的一个页面Url,虽然这么做可以给用户一个好的友好界面,但有时,我们需要给用户提供更多的信息,比如请输入用户名等,这时候config配置的页面就无法达到我们的要求了,那我们该如何来做呢?
其实很简单,使用一个HttpModule就可以了,在这个Module中不要牵涉到其他任何东西,因为在Asp.Net中,一个请求的顺序会把你所有的Module都会执行一次,所以不必担心.Net会遗漏,我们只需要配置好就可以了。那我们这个Module只要做哪些工作呢?只需要处理未处理的异常,首先看一段代码:
ExceptionHandlingModule 1public class ExceptionHandlingModule : IHttpModule
{
IHttpModule 成员#region IHttpModule 成员 public void Dispose()
{ } public void Init(HttpApplication context)
{
context.Error += new EventHandler(context_Error);
} void context_Error(object sender, EventArgs e)
{
var application = (HttpApplication)sender; //获取当前请求的前一个错误
//这里的GetLastError 其实是一个封装好的Exception
//我们如果想要知道真正的Exception的话,需要用InnerException属性获取。
var unHandlingException = application.Context.Server.GetLastError();
if (unHandlingException != null)
{
unHandlingException = unHandlingException.InnerException;
if (unHandlingException != null)
{
ExceptionManager.HandlingException(unHandlingException); //好了,我们已经把unHandlingException处理了,后面就清除吧
application.Context.ClearError(); //当然,如果你想要用户看到错误提示信息的话,记得把Message保留下来
}
}
} #endregion
}
第三篇就说到这里吧,接下来后面将会把自定义异常、处理的代码给大家说明一下。
其实很多内容都是经过修改了,原先的想法在我写博客的时候,感觉越来越不对劲,看来我还得加把劲,有些地方或许说的不是很合理,也希望大家能给我提出建议,以免误导其他读者:)
出处:http://www.cnblogs.com/inday/archive/2009/05/06/1451041.html
异常处理—Exception(三)的更多相关文章
- 异常处理—Exception(二)
在上一篇中"异常处理--Exception(一)"中,跟大家简单介绍了一下Exception,也使大家充分的了解了Exception管理在一个项目中的重要性,那如何在我们的项目中处 ...
- 异常处理 Exception
一.异常类 1.在C#中所有的异常都是使用一个异常类型的示例对象表示的,这些异常类型都是继承自System.Exception类型,或者直接使用System.Exception类型的实例对象: 2.在 ...
- Akka(26): Stream:异常处理-Exception handling
akka-stream是基于Actor模式的,所以也继承了Actor模式的“坚韧性(resilient)”特点,在任何异常情况下都有某种整体统一的异常处理策略和具体实施方式.在akka-stream的 ...
- C#多线程编程(4)--异常处理+前三篇的总结
本来是打算讲并行For和PLINQ的,但是我感觉前三篇我没有讲得很清晰.之前一直在看<CLR via C#>(后文简称CLR)的多线程部分,其中有些部分不是很明白,今天翻开<果壳中的 ...
- Spring全局异常处理的三种方式
在J2EE项目的开发中,不管是对底层的数据库操作过程,还是业务层的处理过程,还是控制层的处理过程,都不可避免会遇到各种可预知的.不可预知的异常需要处理.每个过程都单独处理异常,系统的代码耦合度高,工作 ...
- SpringBoot学习笔记(5)----SpringBoot中异常处理的三种方法
对于异常的处理,Spring Boot中提供默认的一个异常处理界面,如下图: 但是在实际的运用开发中,这样的页面显然是不友好的,Spring Boot也提供了自定义异常处理的方式,如下总结三种一场处理 ...
- Python 工匠: 异常处理的三个好习惯
前言 这是 "Python 工匠"系列的第 6 篇文章.(点击原文链接,可查看系列其他文章) 如果你用 Python 编程,那么你就无法避开异常,因为异常在这门语言里无处不在.打个 ...
- ORACLE PL/SQL异常处理(Exception)学习笔记
1.PL/SQL错误类型 错误类型 报告者 处理方法 编译时错误 PL/SQL编译器 交互式地处理:编译器报告错误,你必须更正这些错误 运行时错误 PL/SQL运行时引擎 程序化地处理:异常由异常处理 ...
- java异常处理Exception
我看别人的面经中有一道题目就问到了Exception,即java的异常处理的,我曾经也学了java的异常处理,可是我查了下,看了别人的博客关于写的exception异常处理.我发现,自己学的不坚固,仅 ...
随机推荐
- linux五大搜索命令学习
五大搜索命令学习 分别解释locate,find,which,whereis,grep 五大linux搜索命令 locate 解释:由man手册可以看出,locate查找就是根据文件名进行查找,只是依 ...
- 玲珑oj 1128 RMQ模板
1128 - 咸鱼拷问 Time Limit:3s Memory Limit:128MByte Submissions:380Solved:118 DESCRIPTION 给你两个序列A,B.每个序列 ...
- JS返回一个数据的千分位格式
/** * 价钱转换-从右往左每3位数字加一个逗号 * @param price 需要转换的价格 */ formatPrice(price){ var newPrice = price.split(' ...
- Python中字符串、列表、元组、集合、字典中的一些知识,有些不太常见
————————笔记——————————# 字符串1. 字符串是不可变的.2. 字符串切片输出:`[start:end:step]`.使用`a[::-1]`倒序输出字符串.3. `str.split( ...
- ActiveMQ教程(消息发送和接受)
一 环境的搭建 version为你的版本号 如果你是普通的项目的话,创建一个lib文件夹,导入相应的jar包到你的lib中,jar包为:activemq-all-{version}.jar.log4j ...
- 【51nod-1042】数字0-9的数量
给出一段区间a-b,统计这个区间内0-9出现的次数. 比如 10-19,1出现11次(10,11,12,13,14,15,16,17,18,19,其中11包括2个1),其余数字各出现1次. Inp ...
- C#运行批处理【转】
/// <summary> /// C#运行bat文件 /// </summary> /// <param name="batPath">< ...
- Alpha冲刺(2/10)
前言 队名:拖鞋旅游队 组长博客:https://www.cnblogs.com/Sulumer/p/9960487.html 作业博客:https://edu.cnblogs.com/campus/ ...
- eclipsec常用快捷键
Eclipse常用快捷键 1几个最重要的快捷键 代码助手:Ctrl+Space(简体中文操作系统是Alt+/)快速修正:Ctrl+1单词补全:Alt+/打开外部Java文档:Shift+F2 显示搜索 ...
- 添加机构organizations模块
startapp organizations models内容: from django.db import models from datetime import datetime # Create ...