如果在C#中处理过程中出现另一个异常,是否有方法捕获原始异常?

如果在C#中处理过程中出现另一个异常,是否有方法捕获原始异常?,c#,exception,try-catch,C#,Exception,Try Catch,假设我们在C#中有以下代码: 在log point(外部捕获)中是否可以访问exception1对象并同时记录该对象?以下是我认为您正在谈论的两个合理示例。它们说明了我在评论中试图描述的内容以及@Jonesopolis所描述的内容 首先是我的案子。假设您正在编写一个实用程序,该实用程序调用可能抛出错误的较低级别服务。您可能希望以这样一种方式来描述实用程序的行为,即可能出现的异常对调用者更有意义。在本例中,我记录了如果出现问题,我的实用程序将抛出一个ApplicationException 我从两

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


在log point(外部捕获)中是否可以访问exception1对象并同时记录该对象?

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

首先是我的案子。假设您正在编写一个实用程序,该实用程序调用可能抛出错误的较低级别服务。您可能希望以这样一种方式来描述实用程序的行为,即可能出现的异常对调用者更有意义。在本例中,我记录了如果出现问题,我的实用程序将抛出一个
ApplicationException

我从两个地方执行此操作,第一个是在检查一些前置条件时(路径名既不是null也不是空的,并且是有效的文件名(我假设有一个
IsValidFileName
函数可以调用))

但另一个地方是,如果我尝试执行该操作,它抛出(我没有检查
文件。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);
    }
}

这段代码没有多大意义。如果你给我们一个实际问题领域的例子,你应该在exception2中做的是抛出新的exception2(“exception2”,exception)。这样,exception1就可以作为exception2的
InnerException
属性使用。捕获并抛出带有内部异常的新异常是一种非常常见的模式,如果不需要,只需
抛出
而不抛出新异常即可
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);
    }
}
public void DoSomethingImportant()
{
    try
    {
        DoSomethingLowLevel();
    }
    catch (Exception ex)
    {
        GetLogger().Log(ex);
        throw;
    }
}