如何捕获System.Exception的不同扩展并确定抛出哪一个?

时间:2015-10-17 17:26:34

标签: c# exception exception-handling

我尝试做的事情看起来像是

        catch ( Exception e )
        {
            Type etype = e.GetType();
            if (etype == ArgumentException.GetType())
            {
                Console.WriteLine("Invalid Arguments: {0}", e.Message);
            }
            else if (etype == ArgumentOutOfRangeException.GetType())
            {
                Console.WriteLine("Arguments Out of Range: {0}", e.Message);
            }
            // ...
        }

我收到了错误

  

非静态字段,方法或者需要对象引用   property' System.Exception.GetType()'

这个错误在我的上下文中意味着什么?我的方法的根本缺陷是什么?

5 个答案:

答案 0 :(得分:2)

为预期的异常类型设置单独的catch块:

try
{
    // do something
}
catch (ArgumentException e)
{
    // respond to an ArgumentException
}
catch (ArgumentOutOfRangeException e)
{
    // respond to an ArgumentOutOfRangeException
}
// ...

答案 1 :(得分:2)

您可以执行以下操作:

try {
    ...
}
catch (ArgumentOutOfRangeException e)
{
    Console.WriteLine("Arguments Out of Range: {0}", e.Message);
}
catch (ArgumentException e)
{
    Console.WriteLine("Invalid Arguments: {0}", e.Message);
}

并且在C#6.0中,您可以根据您设置的条件进一步指定要捕获的异常。例如:

// This will catch the exception only if the condition is true.
catch (ArgumentException e) when (e.ParamName == "myParam")
{
    Console.WriteLine("Invalid Arguments: {0}", e.Message);
}

答案 2 :(得分:2)

你只是:

catch ( ArgumentException e )
{
   // Handle ArgumentException
}
catch ( ArgumentOutOfRangeException e )
{
   // Handle ArgumentOutOfRangeException
}
catch ( Exception e )
{
   // Handle any other exception
}

答案 3 :(得分:1)

你做不到。

GetType仅用于实例化的异常对象。

你应该使用

catch (ArgumentOutOfRangeException e)
{
[...]
}
catch (ArgumentException e)
{
[...]
}

您应该始终catch按顺序从更具体到更少。

答案 4 :(得分:1)

您只能在对象实例上调用GetType()。如果你想保持你的风格(而不是单独的catch块,就像在其他答案中一样):

    catch ( Exception e )
    {
        Type etype = e.GetType();
        if (etype == typeof(ArgumentException))
        {
            Console.WriteLine("Invalid Arguments: {0}", e.Message);
        }
        else if (etype == typeof(ArgumentOutOfRangeException))
        {
            Console.WriteLine("Arguments Out of Range: {0}", e.Message);
        }
        // ...
    }