【问题标题】:Exception when closing WPF window关闭 WPF 窗口时出现异常
【发布时间】:2018-01-16 15:23:56
【问题描述】:

我正在以这种方式创建并显示一个新窗口:

GammeDetail gammeDetail = new GammeDetail(_barCode, userID);
gammeDetail.ShowDialog();

GammeDetail 类的构造函数中,我正在尝试这样做:

try
{
     this._numLot = barcode.Substring(0, barcode.Length - 2); ;
     this._numGamme = barcode.Substring(barcode.Length - 2);
}
catch
{
     this.Close();
}

但这会在gammeDetail.ShowDialog(); 上引发以下异常Cannot set Visibility or call Show, ShowDialog, or WindowInteropHelper.EnsureHandle after a Window has closed.

我还有另一个函数,它是一个事件处理函数,但会关闭当前窗口,如下所示:

private void newScan_Click(object sender, RoutedEventArgs e)
 {
      this.Close();
 }

在这种情况下,它可以按我的意愿完美运行,我尝试创建相同的函数,但没有将其作为事件处理程序,但它抛出了相同的先前异常。

我不明白为什么当函数是事件处理程序时它不抛出任何异常。

如果您有任何想法,我会很高兴听到他们的意见。 (如果您需要一段特定的代码来提供帮助,请随时提出问题,而不是在没有帮助的情况下投反对票。)

【问题讨论】:

  • 我怀疑try { } 块中存在未处理的异常。设置断点in catch { this.Close(); }。您的代码不应“处理”这样的可能异常,因为它根本无法处理它 - 外部代码发送了无效的参数值,对其进行验证并抛出 ArgumentException。
  • 你为什么要在窗口创建之前关闭它?
  • 因为在我的构造函数中,我正在对服务进行一些调用,该服务返回一些我想在窗口上显示的信息。

标签: c# wpf exception-handling event-handling


【解决方案1】:

没有理由在窗口创建之前就尝试关闭它。在构造函数返回之前,没有要关闭的窗口。

您应该在创建窗口实例的代码中处理任何异常:

GammeDetail gammeDetail;
try
{
    gammeDetail = new GammeDetail(_barCode, userID);
    gammeDetail.ShowDialog();
}
catch (Exception)
{
    //the window was never opened...
}

【讨论】:

  • 我想补充一点,如果你知道会发生什么,你应该指定你的例外,此外:docs.microsoft.com/en-us/dotnet/standard/exceptions
  • 是的,我很笨,我是在看到Verendus的回答时才想到的,所以显然我和你的回答一样,非常感谢!在我关闭窗口之前,我并没有想到构造函数还没有完全执行,所以它抛出异常是合乎逻辑的......
  • @FreekW。好吧,在这种情况下,我知道异常是什么,但让我们假设这部分代码在我忘记测试的非常特殊的情况下生成另一个异常,它不会正确捕获它?
  • 这是正确的,如果您不知道会发生什么,则不应使用特定的异常处理程序,但是由于您想知道会发生什么样的错误,因此您可能需要考虑一个指定的例外。这也是为什么一概而论通常被视为不好的做法的原因。
  • 好吧,在我的应用程序中,我正在初始化我想在构造函数中显示的值,以便在窗口显示时显示它们,如果信息不正确,那么我关闭窗口并捕获异常。我想有一种更简洁的方法可以以编程方式进行,但我不知道在这种情况下最好的做法是什么,请问您有什么建议吗?
【解决方案2】:

因为你的构造函数中有一个异常,窗口正在关闭,然后你尝试在一个关闭的窗口上使用 .ShowDialog() 。 在调用 .ShowDialog() 之前,您需要处理异常或检查窗口是否尚未关闭

【讨论】:

  • 谢谢,这是一个愚蠢的问题,但我没有意识到问题出在哪里
猜你喜欢
  • 2017-08-03
  • 1970-01-01
  • 1970-01-01
  • 2011-01-31
  • 2012-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多