none
反射设置属性值,无法捕获抛出的自定义异常 RRS feed

  • 问题

  • private int number = 0;
    public int Number
    {
        get
        {
            return number;
        }
        set
        {
            Throw new MyException("Error");
        }
    }
    
    public void RefCall()
    {
        try
        {
            obj.GetType().GetProperty("Number").SetValue(obj, 10);
        }
        catch(MyException mex)
        {
            //不会捕获
        }
        catch(Exception ex)
        {
            //捕获异常
        }
    }
    如上示意代码所示,通过反射去设置一个属性的值,在属性的set方法中直接抛出一个自定义异常,在调用外部无法捕获这个异常,但会捕获一个普通异常。这是为什么?
    2018年9月25日 14:06

答案

  • 你好,

    你给出的代码中

                try
                {
                    MyClass myClass = new MyClass() { Number = 20};
                    RefCall(myClass.Number);
                    Console.WriteLine("{0}", myClass.Number);
                }
                catch (MyException mex)
                {
                    //会捕获
                }
                catch (Exception)
                {
                    throw;
                }

    实际上是在构造函数后面的成员初始化列表中抛出的异常,

    MyClass myClass = new MyClass() { Number = 20};

    并不是“RefCall”函数抛出的异常。

    是我没说清楚,您所说的NullReference 异常可能是您认为"obj"是一个空的引用,实际是不为空的。我捕获到的异常信息是“调用的目标发生了异常”,很抱歉我不太方便把异常信息复制出来。我感觉像是.NET内部捕获了我的异常然后抛出了一个新的异常


    感谢版主的回答,的确是我猜想的那样,在捕获到的异常的"InnerException"中看到了我抛出的异常信息。

    2018年9月29日 12:32

全部回复

  • 你好,

    那是因为这个异常是个NullReference 异常,并不是你自定义的异常,所以catch 不到你的自定义的异常。 如果是下面的代码就可以catch 到你自定义的异常:

    class Program
        {
           
    
            public static void RefCall(object obj)
            {
                try
                {
                    obj.GetType().GetProperty("Number").SetValue(obj, 10);
                }
                catch (MyException mex)
                {
                    //不会捕获
                }
                catch (Exception e)
                {
                    //捕获异常
                }
            }
            static void Main(string[] args)
            {
                try
                {
                    MyClass myClass = new MyClass() { Number = 20};
                    RefCall(myClass.Number);
                    Console.WriteLine("{0}", myClass.Number);
                }
                catch (MyException mex)
                {
                    //会捕获
                }
                catch (Exception)
                {
                    throw;
                }
             
    
                Console.ReadLine();
            }
        }
    
        public class MyClass
        {
            public int Id { get; set; }
    
            public string Name { get; set; }
    
            private int number = 0;
            public int Number
            {
                get
                {
                    return number;
                }
                set
                {
                    throw new MyException("Error");
                }
            }
    
        }

    Best regards,

    Zhanglong


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2018年9月26日 2:16
    版主
  • 你好,

    你给出的代码中

                try
                {
                    MyClass myClass = new MyClass() { Number = 20};
                    RefCall(myClass.Number);
                    Console.WriteLine("{0}", myClass.Number);
                }
                catch (MyException mex)
                {
                    //会捕获
                }
                catch (Exception)
                {
                    throw;
                }

    实际上是在构造函数后面的成员初始化列表中抛出的异常,

    MyClass myClass = new MyClass() { Number = 20};

    并不是“RefCall”函数抛出的异常。

    是我没说清楚,您所说的NullReference 异常可能是您认为"obj"是一个空的引用,实际是不为空的。我捕获到的异常信息是“调用的目标发生了异常”,很抱歉我不太方便把异常信息复制出来。我感觉像是.NET内部捕获了我的异常然后抛出了一个新的异常


    2018年9月29日 12:24
  • 你好,

    你给出的代码中

                try
                {
                    MyClass myClass = new MyClass() { Number = 20};
                    RefCall(myClass.Number);
                    Console.WriteLine("{0}", myClass.Number);
                }
                catch (MyException mex)
                {
                    //会捕获
                }
                catch (Exception)
                {
                    throw;
                }

    实际上是在构造函数后面的成员初始化列表中抛出的异常,

    MyClass myClass = new MyClass() { Number = 20};

    并不是“RefCall”函数抛出的异常。

    是我没说清楚,您所说的NullReference 异常可能是您认为"obj"是一个空的引用,实际是不为空的。我捕获到的异常信息是“调用的目标发生了异常”,很抱歉我不太方便把异常信息复制出来。我感觉像是.NET内部捕获了我的异常然后抛出了一个新的异常


    感谢版主的回答,的确是我猜想的那样,在捕获到的异常的"InnerException"中看到了我抛出的异常信息。

    2018年9月29日 12:32