在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事件封装类的更多相关文章

  1. UI事件监听的击穿

    什么是UI事件监听的击穿 在游戏视图中,有两个UI界面叠在一起的时候,单击一个空白处,却触发了被覆盖在下层了UI界面中的单击事件,这就是单击击穿了上层界面. 假设场景中放置了一个箱子,单击箱子会触发一 ...

  2. UI事件之load

    load事件属于CSS3规范中的UI事件,load事件处理程序在页面元素和资源(html/script/link/img等)全部加载完成后在window上触发,或在img元素加载完成后再img元素上触 ...

  3. Android学习笔记--处理UI事件

    Handling UI Events 在Android里, 有不只一种方式可以截获用户与你的应用程序交互的事件. 在你的界面上处理事件时,你需要捕获用户与某个View实例交互时所产生的事件.View类 ...

  4. Javascript高级编程学习笔记(61)—— 事件(5)UI事件

    UI事件 UI事件是指那些不一定与用户操作有关的事件 这些事件在DOM规范出现之前,都是以各种不同的形式存在于不同的浏览器 而在DOM事件中为了保证向后兼容,现有的UI事件如下: DOMActivat ...

  5. UI事件与内容,舞台与演员

    UI事件:创建/清除/显示/隐藏/填充内容/位置变化/形态变化/尺寸变化/颜色变化/ 非UI事件:点击/输入/拖动/

  6. unity UI事件

    由于工作需要到持续按键,所以了解了一下unity UI事件,本文主要转载于http://www.cnblogs.com/zou90512/p/3995932.html?utm_source=tuico ...

  7. 事件类型-UI事件、焦点事件

    DOM3级事件包括以下几类事件: UI事件:当用户与页面上的元素交互时触发 焦点事件:当元素获得或失去焦点时触发 鼠标事件:当用户通过鼠标在页面上执行操作时触发 滚轮事件:当使用鼠标滚轮时触发 文本事 ...

  8. UI事件之unload、resize和scroll

    unload事件 当页面卸载或用户从当前页面换到其他页面上时,会在window上触发unload事件.根据DOM2级规范规定,unload应该在body上触发,但所有浏览器都实现了在window上触发 ...

  9. 关于移动端的UI事件分类

    1. click事件 单击事件,类似于PC端的click,但在移动端中,连续click的触发有200ms ~ 300ms的延迟 2. touch类事件 触摸事件,有touchstart touchmo ...

随机推荐

  1. kernel/info.c

    /* * linux/kernel/info.c * * Copyright (C) 1992 Darren Senn */ /* This implements the sysinfo() syst ...

  2. C语言中内存的申请函数

    C语言跟内存申请相关的函数主要有 alloca,calloc,malloc,free,realloc,sbrk等. alloca是向栈申请内存,因此无需释放. malloc分配的内存是位于堆中的,并且 ...

  3. UVa 712 S树

    https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  4. 帝国时代II 高清版 steam 4.4 字体替换 微软雅黑

    其实默认的中文字体算是中规中矩吧,但是我并不喜欢 从昨天开始就想着换 于是我就开始搜索帝国时代2的游戏目录的资源,马上就锁定到了\Steam\steamapps\common\Age2HD\resou ...

  5. C语言新文法

    程序->外部声明 | 程序 外部声明 程序->外部声明A' A'->外部声明A'|ε 外部声明->修饰符 变量名 形参 修饰符->void | int | char | ...

  6. AJAX 的简单用法:

    AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术. AJAX 是一种用于创建快速动态网页的技术.通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这意味着可以 ...

  7. Chapter 5: Design and implement security

    Configure authentication Authenticating users IIS authentication Anonymous ASP.net impersonation Bas ...

  8. C# 导入Excel到DataSet中

    class Import { /// <summary> /// 导入Excel到DataSet中 /// </summary> /// <param name=&quo ...

  9. 1.13 linux笔记

    free -m 看内存脚本 rpm -ivh 显示过程 rpm -U --upgraderpm -F --freshenrpm -e --eraserpm -e koren find / -name ...

  10. 解决 Django 后台上传图片前端无法展示