无法捕获断言。这很好,因为有些错误我不想包含在try / catch中,至少不在开发服务器上。但是Asserts似乎非常危险。如果他们开始生产,它可以使用msgbox挂起ASP.NET服务器。
//Don't want this on prod even if debug=true is in the web.config
#if DEBUG
//A future client programmer can wrap this in a try{}catch{}
if (!EverythingIsOkay)
throw new InvalidOperationException("Dagnabbit, programming error");
//This stops the but has less information that an
// Exception and hangs the server if this accidentally
// runs on production
System.Diagnostics.Debug.Assert(!EverythingIsOkay);
#endif
是否有更好的方法可以将违反不可侵犯条件的行为传达给开发人员,而不会冒着挂起IIS的风险?
更新:在阅读完第一个回复之后,我想答案取决于一种万无一失的方法来检测代码在开发环境中运行的时间以及何时在生产服务器上运行,或者弄清楚如何抛出一个无法捕获和忽略的异常。
答案 0 :(得分:2)
不要真的看到问题。喜欢第一个并抛出异常。然后服务器不会挂起。你也不应该在生产中使用debug.Assert(正如你所提到的)。
抛出异常将停止执行,您将能够捕获它。只需确保您记录异常,调试就可以了。
答案 1 :(得分:1)
您可以使用日志记录工具(即log4net)或实时消息泵(TCP套接字或数据库)来记录“自定义”断言的结果,而不是使用诊断Debug.Assert
吗?你想在Assert失败时停止执行吗?
答案 2 :(得分:1)
我亲自创建了一个名为“Defense”的类,它有两种方法,“Assert”和“Fail”。 Assert与xUnit“assert”的工作方式类似,它采用布尔条件和消息,如果条件为false,则抛出异常。 Fail会马上抛出异常。
这非常简单,并且多次保存了我的 tuches 。它是ASP.NET友好的,并且死得很快。如果您担心在现实世界中抛出这些错误,您可以修改Assert方法,以便使用预处理指令(#if DEBUG ... #endif
)进行记录,但在我的工作中,我宁愿看到硬错误。现实世界,而不是隐藏他们,不知道发生了什么。
答案 3 :(得分:0)
嗯,你不能把一切都变得万无一失,傻瓜太聪明了;)
检测您是否在生产中取决于您,您可以利用服务器的命名约定并检查Environment.MachineName(如果您的网站允许这样做),或者在web.config中使用appSetting。
我不确定Debug.Assert()是否会挂起服务器,你是否在开发服务器上尝试过? MSDN说Assert只在用户界面模式下显示一个消息框 - 没有指定其他情况。
要杀死你的asp.net页面,你可以尝试一个Response.Redirect到程序员的错误页面,或者通过
手动执行 Response.Clear()
Response.Write("Fool! You made a dagnabbit programming error!");
Response.End();
这应该会杀死你的页面,除非有人使用try / catch(Exception ex)反模式。