C# 从被调用函数向调用函数抛出异常';s挡块

C# 从被调用函数向调用函数抛出异常';s挡块,c#,exception,try-catch-finally,C#,Exception,Try Catch Finally,在上面的代码示例中,我有两个函数ReadFile和ReadCSVFile 在ReadCSVFile中,我得到一个FileNotFoundException类型的异常,它被catch(FileNotFoundException)块捕获。但是,当我抛出此异常以在ReadFile函数的catch(FileNotFoundException)中捕获时,它会在catch(exception)块而不是catch(FileNotFoundException)中被捕获。此外,在调试时,ex的值表示为未初始化的对

在上面的代码示例中,我有两个函数
ReadFile
ReadCSVFile


ReadCSVFile
中,我得到一个FileNotFoundException类型的异常,它被catch(FileNotFoundException)块捕获。但是,当我抛出此异常以在
ReadFile
函数的catch(FileNotFoundException)中捕获时,它会在catch(exception)块而不是catch(FileNotFoundException)中被捕获。此外,在调试时,ex的值表示为未初始化的对象。如何将异常从被调用函数抛出到调用函数的catch块,而不丢失内部异常或至少异常消息?

只需在被调用函数中使用throw。不要用多个异常类型重载catch块。让打电话的人来处理

您必须使用
throw而不是
抛出ex

internal static string ReadCSVFile(string filePath)
{
    try
    {
        ...
        ...
    }
    catch(FileNotFoundException ex)
    {
        throw ex;
    }
    catch(Exception ex)
    {
        throw ex;
    }
    finally
    {
        ...
    }
}


//Reading File Contents

public void ReadFile()
{
    try
    {
        ...
        ReadCSVFile(filePath);
        ...
    }
    catch(FileNotFoundException ex)
    {
        ...
    }
    catch(Exception ex)
    {
        ...
    }
}
除此之外,如果您在抓块中不做任何操作,只进行重新抓块,则根本不需要抓块:

internal static string ReadCSVFile(string filePath)
{
    try
    {
        ...
        ...
    }
    catch(FileNotFoundException ex)
    {
        throw;
    }
    catch(Exception ex)
    {
        throw;
    }
    finally
    {
        ...
    }
}
仅执行捕捉块:

  • 当您想要处理异常时
  • 当您希望通过抛出新异常并将捕获的异常作为内部异常来向异常添加其他信息时:

    catch(Exception exc){抛出新的MessageException(“Message”,exc);}

  • 您不必在异常可能冒泡通过的每个方法中都实现catch块。

    您应该替换

    internal static string ReadCSVFile(string filePath)
    {
        try
        {
            ...
            ...
        }
        finally
        {
            ...
        }
    }
    


    在调用的函数中,只需像这样使用throw

    throw;
    

    现在,如果此处出现异常,则调用函数将捕获该异常。

    您的代码在此处工作正常,请检查此处

    我尝试仅使用throw,但结果保持不变。此外,我实际上是在向异常附加一条自定义消息,然后抛出它。然后,您必须抛出一个新异常,并将自定义消息和捕获的异常作为内部异常:catch(exception exc){throw new MessageException(“message”,exc);}使用相同的异常本地对象,你确定内部异常的类型是
    FileNotFoundException
    ?可能的重复不是重复,而是一个缺少信息说明为什么不重复的问题:)我尝试了,但没有帮助。我仍然在调用方的catch块中为异常对象获取ObjectNotInitialized。这可能是另一个异常?如果代码段属于web服务而不是简单的控制台代码,是否有任何区别?不应该有。Web服务也是一种服务,它托管在某个容器中,可能是另一个控制台应用程序,尽管它没有一个可视化的控制台呈现给用户。所以基本上是C#和no。
    throw;
    
     try
     {
       //you code
     }
     catch
     {
         throw;
    }