C# 异常可以在另一个类、程序集或抽象类中处理吗?

C# 异常可以在另一个类、程序集或抽象类中处理吗?,c#,exception,dll,stack,stack-trace,C#,Exception,Dll,Stack,Stack Trace,我认为需要多次复制和粘贴以下错误处理代码。在Catch语句中工作时,我的选项是什么 在这样做的过程中,我是否会丢失有价值的信息?(示例:异常是否在另一个异常中重新包装,或堆栈信息丢失) 有人如何区分myAbstractClass中的“抛出”和下面Select方法中的“抛出”之间的区别 下面是我想要复制的示例代码 public class StackUserDataSource : AbstractEnhancedTableDataSource<StackUserDataServiceC

我认为需要多次复制和粘贴以下错误处理代码。在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;
        }
    }
因为MyExternalExceptionHelperDell可能无法动态选择要侦听的内容(即SQL、vs网络vs文件,但不能进行身份验证)


但是对于上面的代码,我不清楚最终用户如何选择或覆盖我的事件处理方法。

您只能调用
throw
直接在
catch
子句中,而
抛出e可以在有异常实例的任何位置调用。它们之间的区别是
抛出
在保持其原始堆栈跟踪完整的同时重新引发异常,而
抛出e
重置堆栈跟踪,使异常看起来最初是由
throw e引发的-调试时可能会很烦人。因此,我建议您将
switch
语句提取到一个单独的方法中,该方法将
StorageClientException
作为参数,但保留
throwcatch
子句中编写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;
    }
}