如果一个方法执行过程中可能出现错误,但又不好直接重复执行这一段代码更不愿意中断执行。这时候可以选择人工参与的方式,就像安装程序的时候找不到文件,可以让你选择文件,不正确仍可选择是否继续。
本人在网上搜索了一下,发现没有相关的文章。所以自己玩了玩,方法比较差不过效果不错。
方法就是弹出对话框,给交互者处理。见图
弹出对话框需要引用System.windows.form程序集,有些类库项目默认不引用。
所以我就另外建了个项目RetryDialog,生成单独的dll。见代码
namespace
RetryDialog
... {
public class Dlg
...{
public enum XDialogResult
...{
Retry=DialogResult.Cancel,
Abort=DialogResult.Abort
}
public static XDialogResult Show(System.Exception ex)
...{
DialogResult r = new ThreadExceptionDialog(ex).ShowDialog();
if (r == DialogResult.Cancel)
...{
return XDialogResult.Retry;
}
else
return XDialogResult.Abort;
}
}
}
... {
public class Dlg
...{
public enum XDialogResult
...{
Retry=DialogResult.Cancel,
Abort=DialogResult.Abort
}
public static XDialogResult Show(System.Exception ex)
...{
DialogResult r = new ThreadExceptionDialog(ex).ShowDialog();
if (r == DialogResult.Cancel)
...{
return XDialogResult.Retry;
}
else
return XDialogResult.Abort;
}
}
}
这里使用了System.Windows.Form.THreadExceptionDialog系统对话框,点击继续按钮返回值为DialogResult.Cancel。
下面是用户交互的代码
protected
void
LoadPageXml(System.Xml.XmlDocument doc,
string
url)
... {
RELOADXML:
try
...{
doc.LoadXml(m_httprequest.getPage(url));
}
catch (Exception ex)
...{
mysqldb.dblog.SaveLog(string.Format("获取xml数据失败,url={0}", url));
if (RetryDialog.Dlg.Show(ex) == RetryDialog.Dlg.XDialogResult.Retry)
...{
mysqldb.dblog.SaveLog("重试");
goto RELOADXML;
}
}
}
... {
RELOADXML:
try
...{
doc.LoadXml(m_httprequest.getPage(url));
}
catch (Exception ex)
...{
mysqldb.dblog.SaveLog(string.Format("获取xml数据失败,url={0}", url));
if (RetryDialog.Dlg.Show(ex) == RetryDialog.Dlg.XDialogResult.Retry)
...{
mysqldb.dblog.SaveLog("重试");
goto RELOADXML;
}
}
}
原创!谢谢支持