ASP.NET MVC 2.0是否使用异常来控制流程?

3

以下代码会抛出(被处理的)异常,看起来MVC使用异常来测试控制位置。

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

应用程序按预期工作,我注意到在尝试不同位置(Views、Shared)时抛出了异常,其他控件也是如此。显然MVC使用异常来探测文件的不同可能位置。

如果我没记错,使用异常进行流程控制是不好的,也不酷。

注意:让IDE停止所有抛出的异常可以更轻松地调试,我通常会保留它。这就是我从RenderPartial得到异常的方式。


3
如果您指定了错误的控件名称,那不就是一个特例吗? - dotjoe
应用程序运行良好,异常已被处理。它按预期呈现控件,一切正常。我已更改问题以解释这一点。 - THX-1138
2个回答

3

MVC 2.0 并非使用异常来控制流程。

然而,System.Web.dll v2.0(ASP.NET 的核心组件,适用于 .NET 3.5 以前的版本)在从虚拟路径实例化对象方面具有一些效率低下的 API。MVC 2.0 通过具有视图查找缓存来减轻这个问题。默认情况下,在开发过程中禁用此缓存,以便您所做的更改立即可见,这就是为什么会出现这些异常的原因。在真正的生产服务器上,一旦进行了缓存查找,这些异常将不会发生。

顺带一提,MVC 3 将使用 .NET 4 中添加的新 API,因此这个问题将不再存在。


2
在 Release 模式下,视图位置被缓存。

它使得代码不那么恶劣,但并没有解释为什么他们首先要使用异常。为什么你会使用 try { file.Open() } 而不是 if (file.Exists)(我不知道这是否是MVC所做的,只是在阐述我的观点)?(不,我还没有看过代码,仍然希望SO能回答这个问题)。 - THX-1138
如果在发布模式下进行优化,我不介意在调试模式下执行。因此,如果您确保在发布模式下存在视图(应该这样做),则不会进行搜索,因为位置将被缓存并直接访问文件。当然,如果找不到文件或者您没有权限读取它,则会在运行时抛出异常,但这是正常的:这是一个特殊情况。所以我不知道问题在哪里。当异常经常被抛出时,异常是不好的:例如解析用户输入时。但是,在视图位置的情况下,仅在找不到时才会抛出异常。 - Darin Dimitrov
当用于指示非异常情况时,异常是不好的。即使它在宇宙的生命中只发生一次。问题是 - 当我想要调试我的代码时,在RenderPartial上中断了我的IDE。问题是我必须在异常列表中找到异常以禁用由RenderPartial抛出的异常。最重要的是,我很好奇是否有理由使用异常而不是if语句。 - THX-1138
@user93422,请查看我的回复,其中提供了更多关于为什么会发生这种情况的细节。很遗憾,这会影响调试,但在MVC 3中确实无法做任何事情。 - marcind

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接