2010-09-10 67 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