2017-04-26 53 views
0

当我想调试我的应用程序抛出异常,这意味着我需要禁用try-catch块这样的:更好的方式尝试赶上只在释放?

#if !DEBUG 
       try 
       { 
#endif 
        // Do something 
#if !DEBUG 
       } 
       catch (ArgumentException) 
       { 
        Console.WriteLine("Something wrong"); 
       } 
#endif 

注:我知道在Visual Studio中的处理异常突破,但不足之处它是否在同一类型的每个异常中都被打破。 编辑来更改我的意思:例如,函数A和B都抛出NullReferenceException,但我只想检查A什么时候抛出它,但不是B(处理N中的NulRefExc已经是正确的)。

有人可能会问为什么我需要这个。通常我在没有调试的情况下运行ASP.NET MVC代码(但仍然在调试版本中,它有DEBUG变量),并且抛出异常真的很棒,而不是捕获它(当然仅在开发模式下),因为带有堆栈跟踪的错误页面将会显示,所以我们可以更快地跟踪错误。

有没有更清晰的方法来编写代码?

+0

我不看怎么做这个(想象有一个方式)将使您免于“不利之处在于,它在每种相同类型的异常情况下都会中断,无论它发生在何处” – user5328504

+1

您是否需要捕获全局异常?并且在它上面创建断点,您将在调试器中获得堆栈跟踪的完整异常。 – nyconing

+0

Google [asp.net mvc global error handler](https://www.google.ca/search?q=asp+mvc+global+error+handler&oq=asp+mvc+global+e&aqs=chrome.1.69i57j0l5.7663j0j4&sourceid=chrome&ie = UTF-8) – CodingYoshi

回答

2

只是一个想法 离开尝试捕捉

然后做

catch (ArgumentException) 
       { 
#if DEBUG 
       throw SomeCustomExceptionYouCatchWith_break_on_handled_exception(); 
#endif 
        Console.WriteLine("Something wrong"); 
       } 
+2

你甚至可能有自定义异常获取作为构造参数的原始异常 – user5328504

+0

哇,这很好!正是我需要的!如果只是一个简单的调试代码,'#if'指令之间的'throw;'语句就足够了:) –

+0

@DatVM在生产过程中不写入“控制台”,而是写入日志。 [控制台写入在asp中去哪里](http://stackoverflow.com/questions/137660/where-does-console-writeline-go-in-asp-net) – CodingYoshi

1

两件事情:

  1. 多少地方,你要去把#if DEBUG
  2. Console.WriteLine在ASP.NET中没有意义。有关更多信息,请参阅this

你应该做的是将错误记录到数据库,文件或其他东西。这将避免代码中的所有#if DEBUG。有关日志记录的更多信息,请参阅this

这有额外的好处:

  1. 你将能够看到你的错误是什么样子,所以当你进入生产阶段你会得到相同的信息。如果您没有足够的信息,在日志中,开发过程中,您可以更改错误消息并确保堆栈跟踪在那里。当你投入生产时这会很有帮助,因为现在你有更好的错误。
  2. 你的代码是清洁
+1

我认为你应该在将来的某个地方遵循此建议。您目前的方法会变得很难看 – user5328504

+0

@ user5328504抱歉,您的意思是? – CodingYoshi

+0

我的意思是你应该(在将来)制定一个更好的日志记录机制。现在不要担心,下次告诉你如何处理跟踪和日志记录。现在不要放松你的睡眠,虽然 – user5328504

3

由于C#6你也可以使用exception filters为:

try 
{ 
    // Do something 
} 
catch (ArgumentException) when (!Env.Debugging) 
{ 
    // Handle the exception 
} 

Env.Debugging某处定义为

public static class Env 
{ 
#if DEBUG 
    public static readonly bool Debugging = true; 
#else 
    public static readonly bool Debugging = false; 
#endif 
} 

作为一个额外的奖金,你会当未捕获异常对象时,获取原始调用堆栈(由于when测试失败,即在调试中)。在重新抛出异常的情况下,您将不得不提供最初的异常作为内部异常,并且需要做出一些额外的努力来处理它。

此方法还可以根据其他条件来启用/禁用异常处理,一个web.config设置,例如,这将允许您无需重新编译swicth:

public static class Env 
{ 
    public static readonly bool Debugging = 
     Convert.ToBoolean(WebConfigurationManager.AppSettings["Debugging"]); 
} 
+0

酷!我从来没有想过这个。现在这个问题有2个很好的答案,我不知道标记哪个。 P.s:'public const bool'是一个较短的版本。 –