2010-09-10 69 views
3

以下代码引发(处理)异常,看起来MVC使用异常来测试控制位置。ASP.NET MVC 2.0是否使用异常进行流量控制?

<% Html.RenderPartial("LogOnUserControl"); %> 

应用程序按预期工作,我可以看到,尝试不同位置(视图,共享)的情况下抛出异常。其他控件也会发生同样的情况。显然,MVC使用异常来探测文件的不同可能位置。

IIRC使用异常进行流量控制是邪恶的,而且并不酷。 那么,我做错了什么,或者MVC不再酷?

注意:在所有抛出的异常情况下停止IDE会使调试变得更容易,而且我通常不会打开它。这就是我从RenderPartial得到的例外。

+3

如果您指定错误的控件名称,是不是例外情况? – dotjoe 2010-09-10 15:52:17

+0

应用程序正常工作,例外情况正在处理中。它按预期呈现控制,一切正常。我已经改变了这个问题来解释这一点。 – 2010-09-10 16:01:34

回答

3

MVC 2.0对控制流使用异常是不正确的。

但是,System.Web.dll v2.0(ASP.NET到.NET 3.5的核心组件)有一些低效的API来实例化虚拟路径中的对象。 MVC 2.0通过缓存视图查找缓解了这个问题。默认情况下,此缓存在开发过程中被禁用,以便您所做的更改立即可见,这就是您看到这些异常的原因。在真正的生产服务器上,这些异常在查找被缓存后不会发生。作为一个方面说明,MVC 3将使用在.NET 4中添加的新API,所以这不应该成为一个问题了。

2

在释放模式下运行时,视图位置被缓存。

+0

它使它不那么邪恶,但不能解释为什么他们会在第一位使用异常。你为什么要用'try {file.Open()}'而不是'if(file.Exists)'(我不知道MVC是做什么的,只是说明我的观点)? (不,没有看代码,还是希望SO能回答这个问题)。 – 2010-09-10 16:46:25

+0

如果在发布模式下进行优化,我不介意在调试模式下执行此操作。因此,如果您确保您的视图存在(您应该)在发布模式下,则不会进行搜索,因为该位置将被缓存并且该文件可以直接访问。当然,如果没有找到该文件,或者您没有权限读取该文件,则会在运行时抛出异常,但这很正常:这是一种特殊情况。所以我没有看到问题是什么。当它们经常被抛出时,例外情况很糟糕:例如,在解析用户输入时。但是在视图位置的情况下,只有在找不到时才会抛出异常。 – 2010-09-10 17:00:17

+0

用于指示非例外情况时的例外情况很糟糕。即使它发生在宇宙的一生中。问题是 - 当我想调试我的代码时,我在RenderPartial上中断了我的IDE。问题是我必须在异常列表中找到异常来禁用RenderPartial引发的异常。最重要的是,我很好奇,如果有理由使用异常而不是if子句。 – 2010-09-10 17:06:55