1

我在使用 EntityFramework 时遇到问题。虽然以下代码在我的 PC 上运行良好,但当它传输到 VPS(所有内容都已正确预装)时,它给了我一个未处理的异常:System.NullReferenceException:对象引用未设置为对象的实例,但消息框应该抓住这个没有出现。有什么建议么?

先感谢您。

        var cc = new CopierContext();
        try
        {
            MessageBox.Show(cc.Database.Connection.ConnectionString.ToString());

            var matchingProviders2 = cc.Providers.Where(prov => prov.Login == "batman");
        }
        catch (Exception e)
        {
            MessageBox.Show(e.InnerException.Message);
        }

更新:

我终于找到了问题的核心。原因是:我在 VPS 上安装了 .NET 4,而应用程序是使用 .NET 4.5 开发的。安装后一个消除了所有问题。谢谢你的帮助。

4

4 回答 4

1

来自Exception.InnerException属性的文档

InnerException 属性返回与传递给构造函数的值相同的值,或null 引用

由于您正在捕获任何旧异常catch (Exception e),因此很可能抛出的异常不是您期望的异常并且没有 InnerException。这意味着您的 catch 块可能会引发异常。

您可以采取多种行动。

  1. 除了顶级异常处理程序之外,不要在任何东西中捕获 System.Exception 异常。只捕获您知道如何处理的异常。这导致...
  2. 设置顶级异常处理程序
  3. 最后,在记录或显示异常消息时,至少在尝试使用它之前确保你有一个内部异常。

    MessageBox.Show( (e.InnerException != null ? e.InnerException : e).Message );

于 2012-11-28T22:45:43.147 回答
1

我不知道您是如何在您的 VPS 上运行它的,但如果它不是在交互式用户帐户下启动,您的消息框将不会显示。

于 2012-11-28T16:20:01.737 回答
0

我敢打赌,您没有配置某些东西(或没有正确配置它)并且cc.Database.Connection.ConnectionString为空。调用.ToString()会导致 NullReferenceException。这就是您看不到消息框的原因。正如其他人所说 - 使用 MessageBox 进行这种调试不是一个好主意。在捕获中,您应该打印的不是消息,而是 e.ToString() 它将显示应该指向问题所在位置的堆栈跟踪。

于 2012-11-28T21:18:54.533 回答
0

不要使用 MessageBox,因为它是一项服务;将它们记录到磁盘上,以便您可以回忆它们,或者可能会自动将它们邮寄给您,以便您及时了解发生的问题。

您还需要添加e.InnerException.StackTrace到日志中。

于 2012-11-28T16:17:37.163 回答