Я думаю, что хотя вы заменили HandleErrorAttribute
производным классом (ElmahHandleErrorAttribute
), ваш пользовательский атрибут OnException
, вероятно, все еще вызывает base.OnException
- т.е. HandleErrorAttribute.OnException.
HandleErrorAttribute.OnException
полностью игнорирует настройки web.config (не позволяя ASP.NET отображать стандартный YSOD, если customErrors выключен) и устанавливает результат действия равным ViewResult
с кодом состояния 500 и View
установлен на «Ошибка» (по умолчанию, когда свойство View
не было установлено для атрибута).
То есть, я предполагаю, что что-то подобное происходит:
- Вы бросаете исключение
ElmahHandleErrorAttribute
поднимает трубку, регистрирует исключение, звонит base.OnException
HandleErrorAttribute.OnException
устанавливает результат действия на ViewResult
с View
, установленным на "Ошибка"
- ViewEngine не может найти это представление «Ошибка», и поэтому выдает новое исключение
- ... который регистрируется ELMAH, но не принимается
ElmahHandleErrorAttribute
(потому что это исключение произошло вне действия)
- Вместо этого ASP.NET сам подхватывает его и использует errorPages в web.config
- ... вызов / Ошибки / ApplicationError
- ... который отображает нужный вам вид
... но на самом деле это не исключение, которое вы бросили, а исключение, которое бросил ViewEngine.
Возможно, вы захотите реализовать свою собственную обработку исключений, а не основывать ее на HandleError, если вы хотите, чтобы параметры web.config учитывались. Взгляните на HandleErrorAttribute
в источниках MVC ( здесь ), чтобы увидеть, что нужно сделать (и что не следует делать в вашем случае).