从DLL实例化类时的有趣行为

时间:2015-03-18 09:56:36

标签: c#

我目前正在开发一个自动生成API的反射项目。其中一个任务是生成样本响应,这是获取返回类型并仅通过对象生成器运行它的情况。有趣的是,我遇到了一个奇怪的问题。

希望我能够很好地解释这一点。

让我们说我的生成器类叫做'ObjectGenerator'。它将类型作为参数,并尝试从该类型生成预填充类。这就是问题出现的地方。

我有一个具有相当高效的错误处理的外部DLL,但是,在奇怪的情况下,类构造存在异常。但问题是,无论我是否使用try / catch,都不会被捕获。例如:

try
{
   object Gen = new ObjectGenerator(someExternalType);
} catch (Exception ex) {
  // Some exception occurred when trying to create the object
}

当创建对象时发生异常时,将忽略try catch并引发未捕获的异常,从而导致系统崩溃。

这是一个相当有趣的行为,因为我认为异常可能被捕获似乎没有。

有人可以帮我解释一下吗?这似乎不是我的代码的问题,但更通用的事情,因为这在我的代码中不止一次发生。

编辑:看起来这不仅仅是一个外部DLL,但对于任何使用ObjectGenerator的类来说更是如此...嗯 - 可能是错误的代码。

2 个答案:

答案 0 :(得分:1)

看起来系统在之前执行对象c'tor 它会创建异常帧。

至少这是我脑海中唯一可能的解释......

答案 1 :(得分:1)

查看您的代码:

try
{
    ObjectGenerator Gen = new ObjectGenerator();
    object obj = Gen.GenerateObject(typeof(Test));
}
catch (Exception ex)
{
    Console.WriteLine(ex.Message);
}

你正在打电话的课程:

public class Test
{
    public string t;

    public Test()
    {
        t.Split(',');
    }
}

它揭示了你调用Test的构造函数。构造函数访问未初始化的变量t。因此,您获得NullReferenceException

此外,当 Visual Studio和调试中时,尽管存在异常处理程序,仍会抛出一些异常!

按CTRL + ALT + E查看调试时抛出的异常。