我有一个用户控件,它包含多个方法,每个方法都有一个try-catch块。我只捕获一种类型的异常,例如ArgumentException。更新 - 我没有捕获一个例外,但是我定义了多个例外。
这些方法中的每一个都以相同的方式处理ArgumentException,因此我有冗余代码。
我可以在一个地方捕获ArgumentException,以便用户控件中的所有方法都可以使用它吗?
Update1:该应用程序正在生产中使用,并且被许多不太熟悉计算机的人使用。简化 - 他们必须在数据库中插入大量数字(借助手持式光学扫描仪),当然他们会犯错误。至少有8个常见的异常(错误的大小,错误的类型,......),在我的业务逻辑中,我捕获所有这些异常并将它们抛给GUI。因为安装应用程序的环境非常糟糕,所以我会播放一个响亮的错误声音并显示错误消息。
由于业务逻辑,他们有几个选项可以插入这些数字,因此在用户控件中使用多种方法的错误捕获逻辑。
Update2:实际上我没有捕获ArgumentException,而是我自己的异常,例如 CodeFormatException,CodeDoesntExistException,CodeNotInTheSelectedRollException等。
答案 0 :(得分:2)
您可以将这段代码放入一些验证参数函数中,并在函数的开头调用它。
答案 1 :(得分:1)
如果您有非托管代码权限,则可以覆盖UserControl的WndProc
方法(如果您没有非托管代码权限,应用程序将在您UserControl
类后立即抛出异常首先被引用)。键盘,鼠标和绘画事件是由WndProc
中处理的消息引起的,因此在try ... catch中调用该方法的基本实现来处理这些事件。对于其他人,你必须将它们包装在try ... catch中,但是你可以将catch逻辑移动到一个从所有catch块调用的helper方法,这样你就不会复制代码。
编辑: 实际上,我认为这样的事情会更好。它不需要权限,您也可以将它用于从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)
{
// ...
}
}
}
}
答案 2 :(得分:0)
从基类派生异常,然后将异常处理代码重构为接受基本异常类作为参数的方法。然后你可以处理异常并根据需要传播。