2010-04-07 24 views
2

断言不能被发现。这很好,因为我不想在try/catch中包含一些错误,至少不是在开发服务器上。但断言看起来非常危险。如果他们进入生产环境,它可以用msgbox挂起ASP.NET服务器。如何在ASP.NET中安全地Debug.Assert?

//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风险?

UPDATE:看完第一篇后,我想答案取决于一个万无一失的方法,当代码在开发环境中运行,并检测时,它是在生产服务器上,或搞清楚如何抛出一个异常不能被发现和忽略。

+4

总是部署发布版本? – driis 2010-04-07 20:38:28

+4

@driiis错误发生了,我的继任者不会像我一样聪明。为什么要构建陷阱和炸弹? – MatthewMartin 2010-04-07 21:31:14

回答

1

我个人用两种方法“断言”和“失败”创建了一个名为“防御”的类。 Assert与xUnit“assert”的工作方式类似,它需要一个布尔条件和一条消息,并且如果条件为假,则会与消息一起引发异常。失败立即抛出异常。

这是非常简单,并已多次保存我的驼鸟。它对ASP.NET友好,并且很难和快速地死去。如果您担心在现实世界中抛出这些错误,您可以修改Assert方法,以便使用预处理指令(#if DEBUG ... #endif)来记录日志,但在我的工作中,我宁愿在真实世界中看到比隐藏更严重的错误他们并不知道发生了什么事。

2

不真的看到问题。像第一个一样抛出异常。然后服务器不会挂起。你也不应该在生产中使用debug.Assert(正如你所提到的)。

抛出异常也会停止执行,您将能够捕捉到它。只要确保你记录异常,你就可以很好地进行调试。

+0

是的,但是如果我正在编写未来的开发人员(或我)会调用的代码,那么我想保证这个错误是不可接受的。调试。断言(false)不可捕捉,不能被忽略,这很好。 – MatthewMartin 2010-04-07 21:36:05

+0

代码中的错误不应作为debug.Assert显示给调用者。抛出一个异常或者让它变得更好。你应该测试你的代码,以便debug.Assert从不是真的,你可以把它拿走。 – 2010-04-08 08:50:55

1

您可以使用日志工具(即log4net)或实时消息泵(TCP套接字或数据库)来记录“自定义”断言的结果,而不是使用诊断Debug.Assert?当Assert失败时你想停止执行吗?

+0

在开发时,是的。我想归结到区分开发时间和“生产”时间 - 它们都是运行时间,但只有在前者才会停止。日志可能会被忽略,即使是有意愿的开发者也是如此。 – MatthewMartin 2010-04-07 21:34:07

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 (例外ex)反模式。