【问题标题】:I am using try catch but it's still throwing an error in a WPF application我正在使用 try catch 但它仍然在 WPF 应用程序中引发错误
【发布时间】:2011-04-23 15:41:41
【问题描述】:

这是页面构造函数代码

public DebitNoteCreation(int transactionID) :
        this()
    {
        try
        {
            InsertDebitNote dn = new InsertDebitNote();
            dn.Load(transactionID);
            this.DataContext = dn;
        }
        catch (Exception)
        {
            MessageBox.Show("Some of the entries for this transaction are empty so kindly complete them", "Error");
        }
        this.NavigationService.Navigate(new Uri("DisplayTransaction.xaml", UriKind.Relative));
    }

错误信息

对象引用未设置为对象的实例。

我可以看到消息框,但是单击确定按钮后,它会引发上述错误。

【问题讨论】:

  • 这个异常的堆栈跟踪(带有行号)是什么?
  • 请发布确切的调用堆栈
  • 附带说明一下,捕获这样的一般异常是非常糟糕的做法。
  • 由于日期时间为空而发生错误。我是故意这样做的。我想要的是在出现这种情况时导航到其他页面。标记方法听起来不错。会检查的
  • “由于日期时间为空而发生错误。我是故意这样做的。” - 然后检查空日期时间。不要只是假设任何Exception 都意味着这是这种特定情况。 任何数量都可能发生随时的疯狂事情。

标签: c# wpf xaml


【解决方案1】:

由于错误发生在您单击“确定”之后,我预计this.NavigationServicenull,因为构造函数失败。

此外,您不应该假设Exception 的意思是“此事务的某些条目是空的,因此请完成它们”,并且当构造函数显然无法完全初始化对象时允许构造函数成功是非常危险的.

事实上,只有用户界面应该做消息框无论如何。我会重写,以便在检查事务后引发已知异常(即您希望成为问题的场景)。让 UI 捕获该异常并在那里执行消息框。

【讨论】:

  • 您的方法听起来是正确的方法。会尝试看看我该怎么做。另外,我知道为什么会抛出错误,这是因为 DateTime 字段为空。我想要的是当这个错误被抛出时,页面应该导航到他可以完成交易的其他页面
  • @Pankaj “我知道为什么会抛出错误”让我声明:不,你不知道。您知道抛出Exception一个原因。 invalid 然后假设 any Exception 意味着这个。可能是数据上下文被处理了?数据库不可用?记不清?线程中止?堆栈溢出?我每天都看到随机的事情,这完全超出了任何人的安全预测能力。
  • 我已经对页面构造器代码进行了更改,现在是这样的。 InsertDebitNote dn = new InsertDebitNote(); loadMessage = dn.Load(transactionID); if (loadMessage == true) { this.DataContext = dn; } else { this.DataContext = null; } 我对如何浏览页面感到困惑??因为当我将导航代码放入构造函数时,它会抛出空引用
  • @Pankaj 我看不到导航代码 - 你能指出来吗?但是构造函数并不是真正适合导航逻辑的地方......
  • @Mark 现在,我没有在玩页面构造函数,好像事务加载失败,不需要页面。因此,我正在检查上一页本身的事务负载;如果加载,则传递对象,如果发生 FormatException,将显示错误消息。
【解决方案2】:

如果抛出异常以显示消息框,则表明出现问题...您不会将任何内容分配给this.DataContext。这很可能会导致后续错误。

查看NullReferenceException 的堆栈跟踪以了解确切是什么抛出了它,但基本上你试图继续使用一个未完全初始化的对象,这很少是一个好主意。

(请注意,您可能应该捕获一个更具体的异常,并且绝对应该记录它,而不是仅仅显示一个消息框然后忽略它。)

如果您继续前进,请将上下文设置为空笔记或类似的东西。我怀疑您实际上并不想在这种情况下显示该页面。您可能需要考虑在构建页面之前加载事务,以使事情更简洁。

【讨论】:

  • 好吧,我知道为什么会抛出错误,这是因为 DateTime 字段为空。我想要的是当这个错误被抛出时,页面应该导航到他可以完成交易的其他页面
  • @Pankaj:那么您应该在尝试显示页面之前 尝试加载事务。然后,您可以根据事务负载是否正常显示最合适的页面 - 成功案例一或失败案例一。
  • @Pankaj - 查看我在回复下添加的错误;简短版:“不,你没有”
  • @Jon :我应该把导航代码放在哪里,因为当我把导航代码放在构造函数中时,它会抛出空引用。在我可以安全地放置导航代码的构造函数之后是否发生了任何事件??
  • @Pankaj:您应该在开始构建另一个 IMO 页面之前将代码加载到 。如果您无法加载交易,您就不需要该页面,对吗?加载交易的结果引导你要显示哪个页面。
猜你喜欢
  • 1970-01-01
  • 2020-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-12
  • 2021-09-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多