Why can't I catch a generic exception in C#?

后端 未结 3 1430
夕颜
夕颜 2020-12-01 01:13

I was doing some unit testing on code that could throw a number of exceptions depending on the inputs. So I tried something like the below code: (simplified for the example)

相关标签:
3条回答
  • 2020-12-01 01:59

    It would seem that the most specific type of the exception, when given the choice between T and Exception, is exception, and so that handler is invoked.

    I just tried this (you can't do it in C# or VB, but I edited the IL), and changed the second catch clause to catch Object Ex rather than Exception Ex, and in that case, the first handler got hit.

    Edit

    As others have pointed out, it's more to do with running it in the debugger than the specific type

    0 讨论(0)
  • 2020-12-01 02:01

    Bizarre behavior here...

    VS2k8 console app. The following:

    try
    {
        throw new T();
    }
    catch (T tex)
    {
        Console.WriteLine("Caught passed in exception type");
    }
    catch (Exception ex)
    {
        Console.WriteLine("Caught general exception");
    }
    

    results in "Caught general exception".

    But, remove the (useless) variables from the catch statements:

    try
    {
        throw new T();
    }
    catch (T)
    {
        Console.WriteLine("Caught passed in exception type");
    }
    catch (Exception)
    {
        Console.WriteLine("Caught general exception");
    }
    

    results in "Caught passed in exception type"!!!


    Update:

    Heheh... Its a bug: https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=362422&wa=wsignin1.0

    Source? Here. Why does catch(TException) handling block behaviour differ under the debugger after installing Visual Studio 2008?

    0 讨论(0)
  • 2020-12-01 02:11

    It works without Debug

    http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/0b0e5bc9-fab2-45b1-863b-40abae370475

    Ugly workaround (you may add #if DEBUG) :

      try
      {
        throw new T();
      }
      catch (Exception dbgEx)
      {
        T ex = dbgEx as T;
        if (ex != null)
        {
          Console.WriteLine(ex.Message);
        }
      }
    
    0 讨论(0)
提交回复
热议问题