.net 如何捕获用户控件中的所有异常
我有一个用户控件,它包含多个方法,每个方法都有一个try-catch块。我只捕获一种类型的异常,例如ArgumentException。更新-我不捕获一个异常,而是捕获我定义的多个异常 这些方法中的每一个都以相同的方式处理ArgumentException,因此我有多余的代码 我可以在一个地方捕获ArgumentException,以便用户控件中的所有方法都使用它吗 更新1:该应用程序正在生产中使用,许多不太熟悉计算机的人都在使用它。简化-他们必须在数据库中插入大量数字(借助手持式光学扫描仪),当然他们也会出错。至少有8种常见的异常(错误的大小、错误的类型,…),在我的业务逻辑中,我捕获所有这些异常并将它们抛出到GUI。因为安装应用程序的环境非常糟糕,我会播放一个响亮的错误声音并显示错误消息 由于业务逻辑的原因,它们有几个选项来插入这些数字,因此在用户控件的多个方法中都有相同的错误捕获逻辑 更新2:事实上,我并没有捕获ArgumentException,而是捕获我自己的异常.net 如何捕获用户控件中的所有异常,.net,winforms,user-controls,.net,Winforms,User Controls,我有一个用户控件,它包含多个方法,每个方法都有一个try-catch块。我只捕获一种类型的异常,例如ArgumentException。更新-我不捕获一个异常,而是捕获我定义的多个异常 这些方法中的每一个都以相同的方式处理ArgumentException,因此我有多余的代码 我可以在一个地方捕获ArgumentException,以便用户控件中的所有方法都使用它吗 更新1:该应用程序正在生产中使用,许多不太熟悉计算机的人都在使用它。简化-他们必须在数据库中插入大量数字(借助手持式光学扫描仪),
CodeFormatException、CodeDoesNotExistException、CodeNotInSelectedRollException等。您可以将这段代码放入一些验证参数函数中,并在函数的开头调用它。如果您具有非托管代码权限,则可以重写UserControl的
WndProc
方法(如果您没有非托管代码权限,应用程序将在第一次引用UserControl
类时立即引发异常)。键盘、鼠标和绘制事件是由在WndProc
中处理的消息引起的,因此请在try…catch中调用该方法的基本实现来处理这些事件。对于其他事件,您必须将它们分别包装在try…catch中,但您可以将catch逻辑移动到从所有catc调用的助手方法h块,这样您就不会复制代码
编辑:
实际上,我认为这样可能更好。它不需要权限,您也可以将其用于从UserControl上的其他控件触发的事件:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.Load += new TryCatchHandler(new EventHandler(this.Form1_Load)).EventHandler;
this.MouseClick += new TryCatchHandler(new MouseEventHandler(this.Form1_MouseClick)).EventHandler;
this.button1.Click += new TryCatchHandler(new EventHandler(this.button1_Click)).EventHandler;
}
private void Form1_MouseClick(object sender, MouseEventArgs e)
{
// ...
}
private void Form1_Load(object sender, EventArgs e)
{
// ...
}
private void button1_Click(object sender, EventArgs e)
{
// ...
}
private class TryCatchHandler
{
public Delegate handler;
public TryCatchHandler(Delegate handler)
{
this.handler = handler;
}
public void EventHandler(object sender, EventArgs e)
{
try
{
this.handler.Method.Invoke(this.handler.Target, new object[] { sender, e });
}
catch (ArgumentException exc)
{
// ...
}
}
}
}
从基类派生异常,然后将异常处理代码重构为接受基类异常作为参数的方法。然后,您可以处理异常并根据需要进行传播。这是口袋妖怪异常处理。您无法处理ArgumentException,这是一个编程错误。您的捕获处理程序无法我写源代码来修复这个错误。我不确定我是否理解你的答案。我更新了我的问题以更好地描述我的问题。@Hans Passant:我完全同意你的看法。我在global.asax中搜索类似异常处理的东西。。。