无需Try catch 的UI事件封装类
在UI处理中,经常需要进行异常处理,以便在错误发生时能够进行一些自定义的操作,比如,弹出消息框给用户,进行重试操作,记录日志等,如果能够让用户写代码时不用写try...catch,而只是关注业务逻辑的处理,那么开发的效率将得到显著的提升。基于这个目的,我下面对EventHandler进行了封装,在用户进行事件调用时,自动给加上了一个try...catch块,用户捕捉客户端异常,并弹出提示框进行提示。
public class EventHandlerWrapper
{
#region Property
public object Target { get; private set; }
public MethodInfo Method { get; private set; }
public EventHandler Hander { get; private set; }
#endregion
#region Cnstructor
public EventHandlerWrapper(EventHandler eventHandler)
{
if (null == eventHandler)
{
throw new ArgumentNullException("eventHandler");
}
this.Target = eventHandler.Target;
this.Method = eventHandler.Method;
this.Hander += Invoke;
}
#endregion
#region Public Method
public static implicit operator EventHandler(EventHandlerWrapper eventHandlerWrapper)
{
return eventHandlerWrapper.Hander;
}
#endregion
#region Private Method
private void Invoke(object sender, EventArgs args)
{
try
{
this.Method.Invoke(this.Target, new object[] { sender, args });
}
catch (TargetInvocationException ex)
{
object[] attbute = Method.GetCustomAttributes(typeof(MessageAttribute), true);
MessageBox.Show((attbute[0] as MessageAttribute).Message,"提示", MessageBoxButtons.OK, MessageBoxIcon.Information);// + Environment.NewLine + "For detailed information, please view event log", string.Empty, MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
#endregion
}
上面通过反射调用事件的委托方法,并放置在try...catch块中,在catch中,通过查找委托方法中的MessageAttribute,并将attribute中的message通过messagebox的方式弹出来显示给用户。
MessageAttribute的定义如下:
public class MessageAttribute:Attribute
{
public string Message { get; private set; }
public MessageAttribute(string message)
{
this.Message = message;
}
}
其中在MessageAttribute中可以定义更加复杂的逻辑,比如是否记录日志,异常处理策略,与EnterpriseLibrary集成逻辑等,失败重试逻辑等等,更加复杂的处理逻辑。
其应用示例如下:
委托注册:
public Form1()
{
InitializeComponent();
this.button1.Click += new EventHandlerWrapper(this.button1_Click);
}
委托方法:
[Message("启动检验码工具失败")]
private void button1_Click(object sender, EventArgs e)
{
throw new ApplicationException("error");
}
无需Try catch 的UI事件封装类的更多相关文章
- UI事件监听的击穿
什么是UI事件监听的击穿 在游戏视图中,有两个UI界面叠在一起的时候,单击一个空白处,却触发了被覆盖在下层了UI界面中的单击事件,这就是单击击穿了上层界面. 假设场景中放置了一个箱子,单击箱子会触发一 ...
- UI事件之load
load事件属于CSS3规范中的UI事件,load事件处理程序在页面元素和资源(html/script/link/img等)全部加载完成后在window上触发,或在img元素加载完成后再img元素上触 ...
- Android学习笔记--处理UI事件
Handling UI Events 在Android里, 有不只一种方式可以截获用户与你的应用程序交互的事件. 在你的界面上处理事件时,你需要捕获用户与某个View实例交互时所产生的事件.View类 ...
- Javascript高级编程学习笔记(61)—— 事件(5)UI事件
UI事件 UI事件是指那些不一定与用户操作有关的事件 这些事件在DOM规范出现之前,都是以各种不同的形式存在于不同的浏览器 而在DOM事件中为了保证向后兼容,现有的UI事件如下: DOMActivat ...
- UI事件与内容,舞台与演员
UI事件:创建/清除/显示/隐藏/填充内容/位置变化/形态变化/尺寸变化/颜色变化/ 非UI事件:点击/输入/拖动/
- unity UI事件
由于工作需要到持续按键,所以了解了一下unity UI事件,本文主要转载于http://www.cnblogs.com/zou90512/p/3995932.html?utm_source=tuico ...
- 事件类型-UI事件、焦点事件
DOM3级事件包括以下几类事件: UI事件:当用户与页面上的元素交互时触发 焦点事件:当元素获得或失去焦点时触发 鼠标事件:当用户通过鼠标在页面上执行操作时触发 滚轮事件:当使用鼠标滚轮时触发 文本事 ...
- UI事件之unload、resize和scroll
unload事件 当页面卸载或用户从当前页面换到其他页面上时,会在window上触发unload事件.根据DOM2级规范规定,unload应该在body上触发,但所有浏览器都实现了在window上触发 ...
- 关于移动端的UI事件分类
1. click事件 单击事件,类似于PC端的click,但在移动端中,连续click的触发有200ms ~ 300ms的延迟 2. touch类事件 触摸事件,有touchstart touchmo ...
随机推荐
- Web程序员常见的5个错误及解决方案
我是那种脾气暴躁的web用户,但我认为正是如此才驱使我成为一名良好的web开发人员.我会对那些会导致使用网站变得困难的事情恼火,我认为事情越简单越方便越好.这里有五个常见的可用性错误,以及如何避免它们 ...
- SpringMVC中使用Cron表达式的定时器
SpringMVC中使用Cron表达式的定时器 cron(定时策略)简要说明 顺序: 秒 分 时 日 月 星期 年份 (7个参数,空格隔开各个参数,年份非必须参数) 通配符: , 如果分钟位置为* 1 ...
- c语言数据结构之 快速排序
编译器:VS2013 #include "stdafx.h"#include<stdlib.h> //函数声明 void QuickSort(int a[],int n ...
- C# .Net中七层架构浅析
Model实体层,DBUtility数据访问抽象类,IDAL数据访问接口层,SQLServerDAL数据访问层,DALFactory数据访问工厂类,BLL业务逻辑层,UI界面层 一.项目名称及描述:( ...
- 如何用Selenium 向CodeMirror 编辑器输入
用Selenium 自动填写Jenkins上面一个文本输入框,通过css定位很容易,但是输入文字的时候会报错 ElementNotVisibleException: Message: Element ...
- python整理之(字符串、元组、列表、字典)
一.关于字符串的整理总结 对于字符串的操作常用的有这些: 字符串的操作通过dir()函数可以查看 我们先整理没有下划线的用法,有下划线的暂时不去考虑. 1.capitalize 功能:使字符串的首字母 ...
- Python之路,day3-Python基础
三级菜单 menu = { '北京':{ '海淀':{ '五道口':{ 'soho':{}, '网易':{}, 'google':{} }, '中关村':{ '爱奇艺':{}, '汽车之家':{}, ...
- python——threading模块
一.什么是线程 线程是操作系统能够进行运算调度的最小单位.进程被包含在进程中,是进程中实际处理单位.一条线程就是一堆指令集合. 一条线程是指进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条 ...
- how to use ldid
1.进入管理员权限 sudo -s 2.赋予app运行权限 chmod -R 777 cellmap.app 3.查看app权限 ldid -e cellmap.app/cellmap 4.打开窗口 ...
- mybatis 中sql语句传递多个参数
Available parameters are [2, 1, 0, param1, param2, param3] <select id="loginByTeacher" ...