C# 异常可以在另一个类、程序集或抽象类中处理吗?
我认为需要多次复制和粘贴以下错误处理代码。在Catch语句中工作时,我的选项是什么C# 异常可以在另一个类、程序集或抽象类中处理吗?,c#,exception,dll,stack,stack-trace,C#,Exception,Dll,Stack,Stack Trace,我认为需要多次复制和粘贴以下错误处理代码。在Catch语句中工作时,我的选项是什么 在这样做的过程中,我是否会丢失有价值的信息?(示例:异常是否在另一个异常中重新包装,或堆栈信息丢失) 有人如何区分myAbstractClass中的“抛出”和下面Select方法中的“抛出”之间的区别 下面是我想要复制的示例代码 public class StackUserDataSource : AbstractEnhancedTableDataSource<StackUserDataServiceC
- 在这样做的过程中,我是否会丢失有价值的信息?(示例:异常是否在另一个异常中重新包装,或堆栈信息丢失)
- 有人如何区分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;
}
}
因为MyExternalExceptionHelperDell可能无法动态选择要侦听的内容(即SQL、vs网络vs文件,但不能进行身份验证)
但是对于上面的代码,我不清楚最终用户如何选择或覆盖我的事件处理方法。您只能调用
throw
直接在catch
子句中,而抛出e代码>可以在有异常实例的任何位置调用。它们之间的区别是抛出
在保持其原始堆栈跟踪完整的同时重新引发异常,而抛出e
重置堆栈跟踪,使异常看起来最初是由throw e引发的代码>-调试时可能会很烦人。因此,我建议您将switch
语句提取到一个单独的方法中,该方法将StorageClientException
作为参数,但保留throw直接在catch
子句中编写code>。您可以这样做。重要的一点是,throw
需要位于原始的catch
块中,以便保留堆栈跟踪
public IEnumerable<StackUserDataModel> Select()
{
try
{
...
}
catch (StorageClientException e)
{
// You could do this if there is no fancy processing to do
if (!IsCatchableException(e))
throw;
}
}
bool IsCatchableException(StorageClientException e)
{
... optionally do some fancy processing of the exception, e.g. logging....
switch (e.ErrorCode)
{
case StorageErrorCode.AccessDenied:
case StorageErrorCode.AccountNotFound:
....
return true;
}
}
public IEnumerable Select()
{
尝试
{
...
}
捕获(StorageClientException e)
{
//如果没有特别的处理,你可以这样做
如果(!IsCatchable异常(e))
投掷;
}
}
bool IsCatchableException(StorageClientException e)
{
…可选地对异常进行一些奇特的处理,例如日志记录。。。。
开关(例如错误代码)
{
案例StorageErrorCode.AccessDenied:
案例存储ErrorCode.AccountNotFound:
....
返回true;
}
}
您可以像在其他任何地方一样调用catch
块中的helper方法…长switch
语句不起作用有什么原因吗?谢谢@mellamokb,我刚刚更新了这个问题…正确实现ProcessException(e)也是如此代码>这样它返回一个bool,抛出发生在该方法中,而不是我的DLL?我希望类的使用者重写我的异常处理。明智的做法是在catch(Exception e)
部分调用IsCatchableException
,然后让我的应用程序判断异常是否适用于它?这个想法是,用户可以始终实现catch(SpecialException abc)
,而我的代码永远不会看到这一点。
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...
}
public IEnumerable<StackUserDataModel> Select()
{
try
{
...
}
catch (StorageClientException e)
{
// You could do this if there is no fancy processing to do
if (!IsCatchableException(e))
throw;
}
}
bool IsCatchableException(StorageClientException e)
{
... optionally do some fancy processing of the exception, e.g. logging....
switch (e.ErrorCode)
{
case StorageErrorCode.AccessDenied:
case StorageErrorCode.AccountNotFound:
....
return true;
}
}