繁体   English   中英

如果在 C# 中处理该异常期间引发另一个异常,是否有任何方法可以捕获原始异常?

[英]is there any way to catch original exception if another exception raise during handeling that in C#?

假设我们在 C# 中有以下代码和平:

try{
  ....
  try{

    throw new Exception1("exception1");

  }catch(Exception exception){

     ...
    throw new Exception2("exception2");

  }
}catch(Exception exception){
    ...
    log(exception.message);
}

是否可以在日志点(外部捕获)中访问异常 1 对象并记录该对象?

以下是我认为您在谈论的两个合理示例。 它们说明了我在评论中试图描述的内容以及@Jonesopolis 所描述的内容。

先说我的情况。 假设您正在编写一个实用程序,它调用一些可能会抛出的较低级别的服务。 您可能希望以一种可能冒泡的异常对调用者更有意义的方式来描述实用程序的行为。 在这种情况下,我已经记录了如果出现问题,我的实用程序将抛出ApplicationException

我从两个地方这样做,第一个是当我检查一些先决条件时(路径名既不是 null 也不是空的,并且它是一个有效的文件名(我假设有一个IsValidFileName函数我可以调用) )。

但另一个地方是,如果我尝试执行操作并且它抛出(我没有检查File.ReadAllLines实际上曾经抛出IOException ,但我猜它可以)。 在这种情况下,我不想让我的用户因捕获可能的IOException而增加负担,而是将其转换为我记录的ApplicationException 我用我的ApplicationException的捕获和抛出来包装IOException ,但我将IOException作为内部异常包括在内,以便调试和跟踪其他问题。 代码如下:

public IEnumerable<string> AccessFile(string pathName)
{
    if (string.IsNullOrEmpty(pathName) || !IsValidFileName(pathName))
    {
        throw new ApplicationException("Invalid Path Name");
    }

    try
    {
        var result = File.ReadAllLines(pathName);
        return result;
    }
    catch (IOException ex)
    {
        throw new ApplicationException("Error Accessing File", ex);
    }
}

ApplicationException 的第二个参数设置了内部异常。 这种模式常见。


另一个例子是@Jonesopolis 所描述的。

在这里,我有一个工作功能在做某事。 我的应用程序架构要求我在DoSomethingImportant函数所在的级别进行日志记录。 因此,它会捕获在较低级别抛出的任何异常。 但是,该代码想要向DoSomethingImportant函数的调用者冒泡任何异常。 在这里,它只使用没有参数的throw关键字。 这将重新抛出当前异常并让它冒泡。

使用throw;很重要throw; 不带参数,不throw ex; . 前者允许现有的异常冒泡。 后者在捕获点展开堆栈,然后抛出一个新异常,丢失可能指向故障位置的所有堆栈信息。

这是我正在谈论的典型代码。 这也是一个非常常见的模式:

public void DoSomethingImportant()
{
    try
    {
        DoSomethingLowLevel();
    }
    catch (Exception ex)
    {
        GetLogger().Log(ex);
        throw;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM