【问题标题】:Is it possible to go back to the line where an error was encountered in C#?是否可以返回到 C# 中遇到错误的行?
【发布时间】:2013-08-10 22:04:54
【问题描述】:

我正在尝试找到一种更智能的方法来允许用户从遇到错误的位置重试或继续,并且我知道 Exception 类中的堆栈跟踪提供了一些有关错误发生位置的信息,有什么方法可以尝试时间旅行可能在我告诉用户做某事之后回到错误行?

编辑:


据我所见,VB 似乎有类似On Error Resume Next 的东西。我想我正在寻找与此类似但可以为 C# 手动处理的东西。

【问题讨论】:

  • 我认为异常是你程序中的一个错误,所以找到一种方法来修复它而不是“返回”。
  • 您需要缩小这个问题的范围。你在说什么样的“错误”?举个例子。
  • 我知道你的意思,它会跳转到异常处理,而不是异常发生的地方。调试起来非常困难。
  • 这些错误是文件访问错误。有时,我需要人们关闭文件并重试,但我正在编写一个执行大量文件操作的程序,我试图看看是否可以避免在各处添加不同的 try 和 catch。
  • @GrantWinney:很有帮助的建议,但这些错误有时实际上是随机的。文件/文件夹前一秒可能被锁定/无法访问,下一秒就会打开。

标签: c# .net error-handling


【解决方案1】:

据我了解,您正在寻找一种管理异常的方法,并且该主题确实非常复杂... 关于时间旅行机器,VS-Ultimate 中有智能跟踪,只是从最终用户的角度来看,我真的看不到它的好处。 例如,假设您上传了一个文件,但由于某种原因上传失败,让用户重试更新可能会很好,但这个机会必须由您在代码中管理,例如 try/catch以及您在 catch 中重新启动上传的逻辑...但是我真的不知道任何通用方法来尝试/捕获所有内容并允许用户重试,恕我直言,最好这样。 如果这是业务异常,您知道如何管理它。如果是技术错误,你可以用 try/catch 包围敏感代码,然后做相应的事情。

【讨论】:

    【解决方案2】:

    异常显示代码中断的位置,但这并不意味着它是引入错误的位置。

    例如:

    var someString = "";  // Assumed someString will always be nonnull
    someString = DoSomeWork();  // OOPS! Due to a bug, this returns null in some cases.
    Console.WriteLine(someString.Length);
    

    错误出现在第三行,但错误的来源(或格式错误的用户输入等)在前一行。

    改为:

    在代码中选择明确的恢复点,如果出现问题,您可以在其中重新启动并将其包装在 try/catch+loop 中。在用户输入格式错误的情况下:

    do
    {
        try
        {
            var input = Console.ReadLine();
            var myNumber = Int32.Parse(input);
            DoSomethingWithNumber(myNumber);
    
            break;
        }
        catch(Exception e)
        {
            // Optional error handling, explain the error,
            // tell the user to retry, logging, etc.
            // If possible, catch something more specific
            // than Exception (like ArgumentException, 
            // FormatException, etc.).
        }
    } while(true);
    

    On Error Resume Next,虽然它可能偶尔使用,但太容易被滥用,所以我确信它故意没有包含在 .Net 中。

    【讨论】:

      猜你喜欢
      • 2013-05-15
      • 2012-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-24
      • 2018-04-11
      相关资源
      最近更新 更多