Try-Catch 未捕获 C 方法中的异常#

Try-Catch not catching exception in method in C#

提问人:Keven M 提问时间:10/6/2021 最后编辑:Keven M 更新时间:10/6/2021 访问量:1098

问:

我在 WPF 桌面应用程序中有一个搜索框和按钮组合。单击搜索按钮后,它使用方法中的谓词来搜索输入的精确搜索词。这一切都在 try-catch 块中,因此如果搜索词不匹配,它不会使应用程序崩溃。Library.Find()

问题在于,异常没有被捕获,而是尽管有 try-catch 块,它仍然会崩溃。通过调试,我知道异常的类型是 .我也尝试过捕捉,因为这是该方法列出的类型,我什至尝试只使用泛型类型,但从未捕获过任何类型。有人可以帮忙解释一下吗?我敢肯定这是我忽略的简单事情,但我看到的答案都没有类似的情况。NullReferenceExceptionArgumentNullExceptionLibrary.Find()Exception

注意:我在方法的内容周围没有 try-catch 块,因为此方法也用于记录导航按钮(即下一条记录、上一条记录等),在这种情况下 or 没有意义。我只有围绕代码的 try-catch,这可能会引发相关错误,正如我一直被教导的那样。ShowRecord()ArgumentNullNullReference

searchButton 代码:

private void searchButton_Click(object sender, RoutedEventArgs e)
{
    try
    {
        ShowRecord(gameLibrary.Find(x => x.GameName == searchBox.Text));
    }
    catch (ArgumentNullException ex)
    {
        string term = searchBox.Text;
        searchBox.Text = "'" + term + "' was not found in the library.  Please try another search term.";
    }
}

ShowRecord() 代码:

public void ShowRecord(Game game)
{
    titleBlock.Text = game.GameName;
    systemBlock.Text = game.GameSystem;
    formatBlock.Text = game.GameFormat;
    completedBlock.Text = game.IsComplete.ToYesNo();
    totalledBlock.Text = game.IsTotaled.ToYesNo();
    gamepassBlock.Text = game.GamePassStatus;
    installedBlock.Text = game.IsInstalled.ToYesNo();

    recordNumber.Content = (gameLibrary.FindIndex(x => x == game) + 1).ToString();
    recordCount.Content = gameLibrary.Count;
}

编辑我正在按照其中一条评论中的要求粘贴堆栈跟踪,并且可能已经找出了这样做的问题。如最初的问题所述,该方法也用于记录导航;因此,其中有一个段,其中为 TextBox 分配了所定位记录的值(即 )。此时异常正在发生,因此即使它发生在按钮单击事件中的调用中,问题实际上与异常应该捕获的部分无关。这有意义吗?除此之外,@Tam Bui 提到添加第二个只捕获的捕获块,并在其中添加一个断点: 我这样做了,它仍然没有停在断点上,它停在了 TextBox 值赋值处。ShowRecord()TextBox.Text = gameLibrary.GameNameShowRecord()List.Find(Predicate)Exception

假设这是原因,感谢大家的帮助。我看到异常没有被泛型捕获,并且不可能为我屏蔽了所有其他推理,因此混淆和遗漏了实际中断发生的地方。Exception

C# WPF 异常 try-catch

评论

1赞 tkausl 10/6/2021
与其试图抓住一个,不如实际修复你的代码,这样它就不会抛出。NullReferenceException
0赞 Keven M 10/6/2021
这是我最终的计划,但这确实是我第一次尝试使用谓词,所以这是一个学习步骤。事实上,这只是一个临时编译,然后继续添加搜索部分匹配项的功能,但我想知道为什么也会发生这种情况,以达到教育目的。
1赞 TheGeneral 10/6/2021
有些事情并不像你描述的那样,如果没有捕捉到异常,那么这个问题中缺少信息。粘贴实际的堆栈跟踪Exception
1赞 Tam Bui 10/6/2021
如果您尝试调试发生这种情况的原因,则应在该语句之后临时添加第二个“catch”语句,然后在第二个 catch 语句中放置一个断点。然后,在“监视”窗口中,找出返回的内容。这是你应该抓住的例外。这就是我调试这个问题的方式。catch (ArgumentNullException ex)catch (Exception ex)ex.GetType()
0赞 mdisibio 10/6/2021
您是否正在切换线程上下文?您显示的代码是访问 UI 控件,因此这是 UI 线程。gameLibrary、Game、ShowRecord 在哪里?如果在非 UI 线程上引发异常,则不会将其封送回 UI 上下文。您需要在启动代码中设置一些顶级 Application UnhandledException 处理程序

答: 暂无答案