【发布时间】:2011-12-04 21:28:07
【问题描述】:
我发现需要多次复制并粘贴以下错误处理代码。在 Catch 语句中工作时我有哪些选择?
在此过程中,我是否会丢失有价值的信息? (例如:异常是在另一个异常中重新包装,还是堆栈信息丢失)
如何区分 myAbstractClass 中的“抛出”和下面的 Select 方法中的“抛出”?
这是我要复制的示例代码
public class StackUserDataSource : AbstractEnhancedTableDataSource<StackUserDataServiceContext>
{
//.. stuff
public IEnumerable<StackUserDataModel> Select()
{
try
{
var results = from c in _ServiceContext.StackUserTable
select c;
var query = results.AsTableServiceQuery();
var queryResults = query.Execute();
return queryResults;
}
catch (StorageClientException e)
{
// Todo: consider sticking this in another central location
switch (e.ErrorCode)
{
case StorageErrorCode.AccessDenied:
break;
case StorageErrorCode.AccountNotFound:
break;
case StorageErrorCode.AuthenticationFailure:
break;
// ... Yadda yadda, handle some exceptions, not others.. this is a demo.
case StorageErrorCode.TransportError:
break;
default:
break;
}
throw;
}
}
更新:
我怀疑这是可能的,但我可以在外部库中动态捕获和过滤异常吗?这个概念是这样的
try
{
var results = from c in _ServiceContext.StackUserTable
select c;
var query = results.AsTableServiceQuery();
var queryResults = query.Execute();
return queryResults;
}
catch (MyExternalExceptionHelperDLL e)
{
// all exceptions referenced in MyExternalHelper are passed below
MyExternalExceptionHelper.ProcessException(e);
}
catch (exception)
{
}
因为 MyExternalExceptionHelperDLL 可能无法动态选择要侦听的内容(即 SQL、网络、文件,但不是身份验证)
try
{
var results = from c in _ServiceContext.StackUserTable
select c;
var query = results.AsTableServiceQuery();
var queryResults = query.Execute();
return queryResults;
}
catch (exception e)
{
MyExternalExceptionHelper.ProcessException(e);
// The problem is that I don't know how to catch exceptions thrown from that static method above,
// or how to override that exception handling...
}
但是对于上面的代码,我不清楚最终用户如何选择或覆盖我的事件处理方法。
【问题讨论】:
-
您可以像在其他任何地方一样在
catch块中调用辅助方法... -
长的
switch语句什么都不做是有原因的吗? -
谢谢@mellamokb,我刚刚更新了问题...
标签: c# exception dll stack stack-trace