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