我目前没有这个问题,但你永远不会知道,并认为实验总是很有趣.
忽略你的架构甚至要尝试这个问题所必须遇到的明显问题,让我们假设你有一些别人设计的可怕编写代码,你需要在相同的代码中做一堆广泛而多样的操作阻止,例如:
WidgetMaker.SetAlignment(57); contactForm["Title"] = txtTitle.Text; Casserole.Season(true, false); ((RecordKeeper)Session["CasseroleTracker"]).Seasoned = true;
乘以一百.其中一些可能有效,另一些可能会出错.你需要的是C#相当于"on next resume next",否则你将最终复制并粘贴许多代码行的try-catch.
你会如何解决这个问题?
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 );
重构为个别的,命名良好的方法:
AdjustFormWidgets(); SetContactTitle(txtTitle.Text); SeasonCasserole();
每个都得到适当的保护.
我会说什么都不做.
是的,没事.
你已经清楚地向我发现了两件事:
你知道这个架构很糟糕.
有很多这种废话.
我说:
没做什么.
添加一个全局错误处理程序,以便在每次繁荣时向您发送电子邮件.
等到有什么东西翻倒(或测试失败)
纠正(在页面范围内根据需要重构).
每次出现问题时重复.
如果情况那么糟糕,你马上就可以清理它.是的,我知道这听起来很糟糕,你可能会开始用错误修正你的头发,但它会允许你在(大量)代码之前修复有需要/错误的代码,无论多么糟糕它可能实际工作看起来.
一旦你开始赢得战争,你将有更好的处理代码(由于你的所有重构)你将有一个更好的想法为它赢得设计..
试图将所有这些包装在气泡包装中可能需要很长时间才能完成,你仍然不会更接近解决问题.
很明显,你在VB.NET中编写代码,实际上有On Error Resume Next,并将它导出到DLL中C#.其他任何东西都只是一种惩罚的贪婪.
详细说明,我想我正在质疑这个问题.如果抛出异常,为什么您希望代码只是继续,好像什么都没发生一样?您可能希望在某些情况下出现异常,在这种情况下,您可以围绕该代码编写try-catch块并处理它们,或者出现意外错误,在这种情况下,您应该更喜欢应用程序中止,重试或失败.没有继续像受伤的僵尸呻吟'大脑'.
On Error Resume Next
在C#世界中,这是一个非常糟糕的主意.也不会添加相当于On Error Resume Next
实际帮助你.它所做的只是让你处于一个糟糕的状态,这可能会导致更微妙的错误,数据丢失和可能的数据损坏.
但是为了让提问者得到应有的答案,你可以添加一个全局处理程序并检查TargetSite以查看哪种方法已经过了.然后你至少可以知道它是什么线.下一部分将尝试找出如何设置"下一个语句"与调试器的相同方式.希望你的筹码在这一点上不会被解开,或者你可以重新创造它,但它肯定值得一试.但是,根据这种方法,代码必须每次都以调试模式运行,以便包含调试符号.
这是预处理器有用的事情之一.您可以定义一个吞下异常的宏,然后使用快速脚本将该宏添加到所有行.
所以,如果这是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,不要忽视它!".:)