【问题标题】:How can I have an exception show in debugging output that doesn't cause a "catch"如何在调试输出中显示不会导致“捕获”的异常
【发布时间】:2021-12-26 17:28:28
【问题描述】:

这可能是一个基本问题,但我无法通过搜索找到答案。我的代码导致异常写入 Visual Studio 中的“输出”->“调试”窗口。无论如何,我的try...catch 正在执行下一行代码。 NuGet 包除外。

这是否意味着 NuGet 包中发生异常并由 Nuget 包处理?如何进一步解决此问题?

private void HandleStorageWriteAvailable(IXDocument doc)
{
    using IStorage storage = doc.OpenStorage(StorageName, AccessType_e.Write);
    {
        Debug.WriteLine("Attempting to write to storage.");

        try
        {
            using (Stream str = storage.TryOpenStream(EntityStreamName, true))
            {

                if (str is not null)
                {
                    try
                    {
                        string test = string.Concat(Enumerable.Repeat("*", 100000));
                        var xmlSer = new XmlSerializer(typeof(string));
                        xmlSer.Serialize(str, test);
                    }
                    catch (Exception ex)
                    {
                        Debug.WriteLine("Something bad happened when trying to write to the SW file.");
                        Debug.WriteLine(ex);
                    }
                }
                else
                {
                    Debug.WriteLine($"Failed to open stream {EntityStreamName} to write to.");
                }
            }

        }
        catch (Exception ex)
        {
            Debug.WriteLine(ex);
        }
    }
}

异常发生在using (Stream str = storage.TryOpenStream(EntityStreamName, true)) 行,当异常发生时代码继续执行下一行而不是捕获。

如果该异常正在由其他东西处理,这是正常行为吗?我以前从未见过这种情况。

【问题讨论】:

  • > 这是否意味着 NuGet 包中发生异常并由 Nuget 包处理?大概是这个。如果原始代码不重新抛出异常,您将不会捕获它。要进行更多调查,您可以检查 NuGet 的源代码(如果可用)(它们通常是)

标签: c# exception try-catch


【解决方案1】:

通常,会设计一个名为 TrySomething 的方法,使其不会抛出异常,而是返回某种错误代码。

例如检查 Dictionary 类:它有一个 Add 方法,如果密钥已经存在,它可以抛出一个 ArgumentException,而一个 TryAdd 方法只是返回 false。

很有可能,您的 TryOpenStream 的 IStorage 实现也有一个 OpenStream 方法,而 Try 版本只是一个 try/catch 包装器,它在发生错误时将错误输出到控制台。

【讨论】:

    【解决方案2】:

    你怎么知道它发生在那条线上? 但是,有一个设置可以在“异常设置”对话框 (Ctrl+Alt+E) 中启用中断处理的异常。对于您可以控制的每种异常类型。这是一个解释其工作原理的链接:https://docs.microsoft.com/en-us/visualstudio/debugger/managing-exceptions-with-the-debugger?view=vs-2022

    【讨论】:

    • 我知道它发生在该行,方法是在有问题的行之前设置一个断点并一次执行一行。我会看看那个链接,谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-22
    • 2010-10-14
    相关资源
    最近更新 更多