如何区分 InvalidOperationException 异常类型?

How to differentiate between InvalidOperationException exception types?

如何检测 InvalidOperationException 类型

这是内部异常消息:

System.InvalidOperationException: ExecuteNonQuery requires an open and available Connection. The connection's current state is closed.

我需要准确地检测到这种类型的异常来处理它。 我可以知道它的 HResult 编号或异常代码吗?或者其他方式?

您可以使用 try/catch 异常处理层次结构,以便首先捕获 InvalidOperationException 并与其他异常类型(例如通用异常类型)分开处理。

try
{
    // Normal workflow up here
}
catch (System.InvalidOperationException ioex)
{
    // Handle InvalidOperationException
    Console.WriteLine(ioex.StackTrace);
}
catch (System.Exception ex)
{
    // Handle generic exception
    Console.WriteLine(ex.StackTrace);
}

但是,您的问题表明这对您不起作用,因为您提到了内部异常。在那种情况下,您可能需要像这样对内部异常进行一些类型检查:

try
{
    // Normal workflow up here
}
catch (System.Exception ex)
{
    if (ex.InnerException is InvalidOperationException) 
    { 
        // Handle InvalidOperationException
    }
    else 
    { 
        // Handle generic exception
    } 

    Console.WriteLine(ex.StackTrace);
}

你能给我们更多的背景信息吗?这将使我们更容易回答您的问题。

但是,如果我理解正确的话,您尝试使用内部异常处理 'something'。从 C# 6 开始,有 异常过滤器 可用。有关异常过滤器的更多信息,请参阅 Exception filters

文档还提供了示例。

在您的特定情况下,您可以按如下方式使用异常过滤器:

try
{
    // Do something that could cause a InvalidOperationException
}
catch (InvalidOperationException ex) when (ex.InnerException is SomeTypeOfException)
{
    // Handle this type of exception
}
catch (InvalidOperationException ex) when (ex.InnerException is AnotherSomeTypeOfException)
{
    // Handle this kind of exception
}

此代码可能有帮助

try
{
    //your code here...
}
catch (Exception exception) when (exception.InnerException is InvalidOperationException)
{
    var exceptionMessage = "ExecuteNonQuery requires an open and available Connection";
    if (exception.Message.Contains(exceptionMessage) || exception.InnerException.Message.Contains(exceptionMessage))
    {
        //handle it...
    }
}