当前位置:  开发笔记 > 编程语言 > 正文

尝试捕获每行代码而不使用单独的try-catch块

如何解决《尝试捕获每行代码而不使用单独的try-catch块》经验,为你挑选了7个好方法。

我目前没有这个问题,但你永远不会知道,并认为实验总是很有趣.

忽略你的架构甚至要尝试这个问题所必须遇到的明显问题,让我们假设你有一些别人设计的可怕编写代码,你需要在相同的代码中做一堆广泛而多样的操作阻止,例如:

WidgetMaker.SetAlignment(57);
contactForm["Title"] = txtTitle.Text;
Casserole.Season(true, false);
((RecordKeeper)Session["CasseroleTracker"]).Seasoned = true;

乘以一百.其中一些可能有效,另一些可能会出错.你需要的是C#相当于"on next resume next",否则你将最终复制并粘贴许多代码行的try-catch.

你会如何解决这个问题?



1> Lost Plugin ..:
public delegate void VoidDelegate();

public static class Utils
{
  public static void Try(VoidDelegate v) {
    try {
      v();
    }
    catch {}
  }
}

Utils.Try( () => WidgetMaker.SetAlignment(57) );
Utils.Try( () => contactForm["Title"] = txtTitle.Text );
Utils.Try( () => Casserole.Season(true, false) );
Utils.Try( () => ((RecordKeeper)Session["CasseroleTracker"]).Seasoned = true );


从.net 3.5开始,您可以使用Action而不是voidDelegate.
这里的主要问题是"catch {}",它将捕获永远不会被捕获的内容,包括CLR状态中的低级错误.

2> plinth..:

重构为个别的,命名良好的方法:

AdjustFormWidgets();
SetContactTitle(txtTitle.Text);
SeasonCasserole();

每个都得到适当的保护.



3> Rob Cooper..:

我会说什么都不做.

是的,没事.

你已经清楚地向我发现了两件事:

    你知道这个架构很糟糕.

    有很多这种废话.

我说:

没做什么.

添加一个全局错误处理程序,以便在每次繁荣时向您发送电子邮件.

等到有什么东西翻倒(或测试失败)

纠正(在页面范围内根据需要重构).

每次出现问题时重复.

如果情况那么糟糕,你马上就可以清理它.是的,我知道这听起来很糟糕,你可能会开始用错误修正你的头发,但它会允许你在(大量)代码之前修复有需要/错误代码,无论多么糟糕它可能实际工作看起来.

一旦你开始赢得战争,你将有更好的处理代码(由于你的所有重构)你将有一个更好的想法为它赢得设计..

试图将所有这些包装在气泡包装中可能需要很长时间才能完成,你仍然不会更接近解决问题.



4> Mark Bracket..:

很明显,你在VB.NET中编写代码,实际上有On Error Resume Next,并将它导出到DLL中C#.其他任何东西都只是一种惩罚的贪婪.



5> Matt Howells..:

快速失败

详细说明,我想我正在质疑这个问题.如果抛出异常,为什么您希望代码只是继续,好像什么都没发生一样?您可能希望在某些情况下出现异常,在这种情况下,您可以围绕该代码编写try-catch块并处理它们,或者出现意外错误,在这种情况下,您应该更喜欢应用程序中止,重试或失败.没有继续像受伤的僵尸呻吟'大脑'.



6> Orion Adrian..:

On Error Resume Next在C#世界中,这是一个非常糟糕的主意.也不会添加相当于On Error Resume Next实际帮助你.它所做的只是让你处于一个糟糕的状态,这可能会导致更微妙的错误,数据丢失和可能的数据损坏.

但是为了让提问者得到应有的答案,你可以添加一个全局处理程序并检查TargetSite以查看哪种方法已经过了.然后你至少可以知道它是什么线.下一部分将尝试找出如何设置"下一个语句"与调试器的相同方式.希望你的筹码在这一点上不会被解开,或者你可以重新创造它,但它肯定值得一试.但是,根据这种方法,代码必须每次都以调试模式运行,以便包含调试符号.



7> Herms..:

这是预处理器有用的事情之一.您可以定义一个吞下异常的宏,然后使用快速脚本将该宏添加到所有行.

所以,如果这是C++,你可以这样做:

#define ATTEMPT(x) try { x; } catch (...) { }
// ...
ATTEMPT(WidgetMaker.SetAlignment(57));
ATTEMPT(contactForm["Title"] = txtTitle.Text);
ATTEMPT(Casserole.Season(true, false));
ATTEMPT(((RecordKeeper)Session["CasseroleTracker"]).Seasoned = true);

不幸的是,似乎没有多少语言包含像C/C++这样的预处理器.

您可以创建自己的预处理器并将其添加为预构建步骤.如果您觉得完全自动化它,您可能会编写一个预处理器,它将获取实际的代码文件并自行添加try/catch内容(因此您不必手动将这些ATTEMPT()块添加到代码中) .确保它只修改了它应该是困难的行(必须跳过变量声明,循环结构等,以免你破坏构建).

但是,我认为这些都是可怕的想法,永远不应该这样做,但问的是.:)

真的,你不应该这样做.您需要找到导致错误的原因并进行修复.吞咽/忽略错误是件坏事,所以我认为这里的正确答案是"修复bug,不要忽视它!".:)

推荐阅读
放ch养奶牛
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有