上文说到异常处理的2个原则,本文则要表述我们在公司程序开发应该怎么做。以WinForm为例:
1.后台程序:后台程序对于前台调用时,可能出现的确定异常,将抛特定异常给前台;前台可以根据接口可能出现的异常,进行特定异常处理;如果认为调用不会出现,则也可以不处理
举例说明:
public interface IFoo
{
/// <summary>
/// 获得状态名称
/// </summary>
/// <param name="status">1~3</param>
/// <exception cref="ArgumentOutOfRangeException">参数超出预期范围</exception>
/// <returns></returns>
string GetStatusName(int status);
}
internal class FooImp : IFoo
{
string IFoo.GetStatusName(int status)
{
string retVal = string.Empty;
switch (status)
{
case 1:
//TODO
break;
case 2:
//TODO
break;
case 3:
//TODO
break;
default:
throw new ArgumentOutOfRangeException("status", status, "必须为1、2、3");
}
return retVal;
}
}
2.前台程序:
前台可以写一专门报告异常的对话框,并结合派尔提供的异常报告系统进行处理。
1)建议记录客户的最近5步操作,并作为内容提交到Crash.im2x.com
2)提交异常后,如果在Crash.im2x.com已解决,告知客户解决版本号,并指引客户进行自主升级
3.利用好Crash.im2x.com异常报告系统
1)异常报告系统简介:异常报告系统提供DLL共各个软件集成,方便各个软件开发者跟进自己开发的软件产生的异常;异常解决后,客户再次报告异常将会获得解决信息,并指引客户升级。
以派尔玻璃ERP为例,讲述下异常报告系统工作方式。假设当前软件版本为9.3.2.28773,报告了一条异常给Crash.im2x.com;如果另外一个用户使用的版本为9.3.3.21458,如果异常的StackTrace和Message一致,Crash.im2x.com将认为是用一条异常,进行合并,给开发者提供此次异常出现的次数。开发者需要看到细节,可点此异常进行查看。
开发者如果解决了此异常,点解决后,将要求输入解决的版本号,假设为9.3.4解决此异常,建议输入解决版本号为9.3.4.99999。所有用户使用的版本号低于解决版本号的,将会在DLL提供的方法返回值给予解决版本号,开发者可以根据自己的需要给用户进行提醒;如果用户的版本号高于解决版本号(比如:9.5.6.23123),则会重新创建一条新的异常记录!(再次导致相同异常可能是开发者找的解决方案不正确)
某些用户操作不合理或者一些系统异常无法解决的情况下,我们该如何来解决问题?举例说明: 下面为玻璃ERP报告的一条异常信息:
“
错误信息:
System.Data.OleDb.OleDbException (0x80040E14): 由于表 '标签' 正被别的用户或进程使用,数据库引擎无法锁定它。 在 System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(OleDbHResult hr) 在 System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams, Object
“
try
{
DoSomething();
}
catch( System.Data.OleDb.OleDbException ex )
{
if( ex.Message == "由于...")
{
MessageBox.Show(ex.Message + "解决办法:http://forum.im2x.com/UI/User/PostReader.aspx?Id=5897" );
}
else
{
throw ex;
}
}
上面只是为了好表达,实际中我们不用MessageBox,可以直接将这个解决贴的地址作为一个链接,用户直接点链接跳转到帖子上。
|