powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / MVC: обработка исключения в контроллере
25 сообщений из 406, страница 1 из 17
MVC: обработка исключения в контроллере
    #38765905
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обрабатываю исключение контроллера в самом контроллере:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
    protected override void OnException(ExceptionContext filterContext)
    {
      if (...)
      {
        ...
        filterContext.Result = ...;
        filterContext.ExceptionHandled = true;
      }
      else
      {
        base.OnException(filterContext);
      }
    }

Пока отлаживал в студии - все нормально, необходимые исключения перехватывались, на клиента возвращался код 200.

Выложил на хостинг - стал возвращаться код 500.
Подумав, добавил в обработчик строку:
Код: c#
1.
          filterContext.HttpContext.Response.StatusCode = 200;

заработало и на хостинге.


То есть проблема решена, но хотелось бы понять, отчего разное поведение?
...
Рейтинг: 0 / 0
MVC: обработка исключения в контроллере
    #38765948
codearticles.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.ProОбрабатываю исключение контроллера в самом контроллере
Плохая практика.
...
Рейтинг: 0 / 0
MVC: обработка исключения в контроллере
    #38765979
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProТо есть проблема решена, но хотелось бы понять, отчего разное поведение?Разная версия IIS?
...
Рейтинг: 0 / 0
MVC: обработка исключения в контроллере
    #38765993
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Proхотелось бы понять, отчего разное поведение?
Потому что веб-сервер используемый при отладке и полноценный IIS это две разных вещи.

Shocker.ProПодумав, добавил в обработчик строку:
Код: c#
1.
filterContext.HttpContext.Response.StatusCode = 200;


Это плохая идея т.к. ошибки будут индексироваться поисковиками.
...
Рейтинг: 0 / 0
MVC: обработка исключения в контроллере
    #38766019
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bazileЭто плохая идея т.к. ошибки будут индексироваться поисковиками.не будут - это ответ на аякс-запрос.
bazileПотому что веб-сервер используемый при отладке и полноценный IIS это две разных вещи.это-то я догадался, но что именно влияет? По моему пониманию, это вообще не должно было выйти за пределы MVC-шной и моей dll-ки и IIS-у должен быть отдан только готовый statuscode
codearticles.ruПлохая практика.Почему? Исключения генерятся на различных уровнях, из репозитория, из BL, самим контроллером. Некоторое количество известных ситуаций обрабатывает контроллер и выдает пользователю более информативное сообщение, чем 500.
...
Рейтинг: 0 / 0
MVC: обработка исключения в контроллере
    #38766028
codearticles.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.ProПочему? Исключения генерятся на различных уровнях, из репозитория, из BL, самим контроллером. Некоторое количество известных ситуаций обрабатывает контроллер и выдает пользователю более информативное сообщение, чем 500.
Исключение - это серьезный сбой программы, а не просто какая-то нотификация из недр BL и прочих слоёв. Нотификации нужно получать через результаты методов. Исключения нужно получать глобально, хотя бы уж через базовый контроллер, от которого наследуются остальные контроллеры.

Хотя бы что-то типа того:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
protected override void OnException(ExceptionContext filterContext)
{
    if (filterContext != null)
    {
        var ex = filterContext.Exception ?? new Exception("Информация об исключении отсутствует.");

        filterContext.ExceptionHandled = true;

        if (ex is HttpException && (ex as HttpException).GetHttpCode() == 401)
        {
            filterContext.Result = AuthorizeRedirectAttribute.RouteResult;
            return;
        }

        var exeption = GetErrors(ex).Last();
        var data = new ErrorModel
        {
            ErrorMessage = exeption.Message, // string.Format("{0}\n{1}", exeption.Message, exeption.StackTrace),
            Exceptions = new[] { exeption },
        };

        filterContext.Result = View("ErrorPage", data);
    }
}

public IEnumerable<Exception> GetErrors(Exception exception)
{
    if (exception is DbEntityValidationException)
    {
        foreach (var validationErrors in (exception as DbEntityValidationException).EntityValidationErrors)
        {
            foreach (var validationError in validationErrors.ValidationErrors)
            {
                exception = new Exception(string.Format("{0}:{1}", validationError.PropertyName, validationError.ErrorMessage));
                break;
            }
        }
    }

    while (exception != null)
    {
        yield return exception;
        exception = exception.InnerException;
    }
}
...
Рейтинг: 0 / 0
MVC: обработка исключения в контроллере
    #38766037
st_st
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
codearticles.ru,

где у себя на сайте 404 перехватываешь? Чё-то у меня путь с точками нифига не попадает в application error в global.asax, а другие 404 нормал.
...
Рейтинг: 0 / 0
MVC: обработка исключения в контроллере
    #38766039
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
codearticles.ruИсключение - это серьезный сбой программы, а не просто какая-то нотификация из недр BL и прочих слоёв. Нотификации нужно получать через результаты методов.Чё опять?

Будем действовать как в Win API: getlasterror, hresult и всё такое? Сделать специальный InfoException для прикладных ошибок не лучше? Во все времена делалось именно так.
codearticles.ruИсключения нужно получать глобально, хотя бы уж через базовый контроллер...Лучше написать фильтр, и присобачить его на соответствующем уровне.
...
Рейтинг: 0 / 0
MVC: обработка исключения в контроллере
    #38766048
codearticles.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
st_stcodearticles.ru,

где у себя на сайте 404 перехватываешь? Чё-то у меня путь с точками нифига не попадает в application error в global.asax, а другие 404 нормал.

http://codearticles.ru/articles/2337
http://codearticles.ru/articles/2506

Алексей КЧё опять?

Будем действовать как в Win API: getlasterror, hresult и всё такое? Сделать специальный InfoException для прикладных ошибок не лучше? Во все времена делалось именно так.
codearticles.ruИсключения нужно получать глобально, хотя бы уж через базовый контроллер...Лучше написать фильтр, и присобачить его на соответствующем уровне.
В сад! :)
...
Рейтинг: 0 / 0
MVC: обработка исключения в контроллере
    #38766089
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
codearticles.ruИсключение - это серьезный сбой программы, а не просто какая-то нотификация из недр BL и прочих слоёв. Нотификации нужно получать через результаты методов.Зачем? Методы возвращают необходимую информацию. Превращать исключение на нижнем уровне в параметр и начинать его гнать вверх по стеку вызова вручную? нафига. Исключение само пройдет по стеку, не нужно будет париться в каждом методе.
К тому же, это не нотификации, это именно исключения. Например неожиданно не найдена запись в БД (возможно она была удалена этим же пользователем в другом сеансе работы). Но, не вижу, почему бы не использовать исключения как нотификации по непредусмотренным стандартной обработкой ситуациям.
codearticles.ruИсключения нужно получать глобально, хотя бы уж через базовый контроллер, от которого наследуются остальные В общем-то так и делаю. Есть коллекция стандартных текстов для некоторых исключений, если базовый контроллер нашел исключение в своей коллекции - он меняет ответ.
...
Рейтинг: 0 / 0
MVC: обработка исключения в контроллере
    #38766186
st_st
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
codearticles.ru,

Первую ссылку глянул, 404 нормально точки в урле схватывает, единственное на старом коде 500-ые поотваливались - Server.GetLastError() в null ушёл, надо починить. Вторую ссылку ещё не тестил.

На этом форуме смотрю с точками тоже шняга, но уже не 404, а 500 - http://sql.ru/.../ , в то время как sql.ru/ghggh нормально.
...
Рейтинг: 0 / 0
MVC: обработка исключения в контроллере
    #38766188
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А кто-нибудь ответ на первоначальный вопрос знает?
...
Рейтинг: 0 / 0
MVC: обработка исключения в контроллере
    #38766198
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro А кто-нибудь ответ на первоначальный вопрос знает? Нет.

Решили не по стандарту ошибки обрабатывать, сами и разбирайтесь :)
...
Рейтинг: 0 / 0
MVC: обработка исключения в контроллере
    #38766200
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro А кто-нибудь ответ на первоначальный вопрос знает? 16655639

?
...
Рейтинг: 0 / 0
MVC: обработка исключения в контроллере
    #38766227
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
codearticles.rust_stcodearticles.ru,

где у себя на сайте 404 перехватываешь? Чё-то у меня путь с точками нифига не попадает в application error в global.asax, а другие 404 нормал.

http://codearticles.ru/articles/2337
http://codearticles.ru/articles/2506 Боян . Глобальный обработчик системных ошибок надо делать через global.asax. А прикладные ошибки лучше ловить фильтрами .

codearticles.ruАлексей КЧё опять?

Будем действовать как в Win API: getlasterror, hresult и всё такое? Сделать специальный InfoException для прикладных ошибок не лучше? Во все времена делалось именно так.
пропущено...
Лучше написать фильтр, и присобачить его на соответствующем уровне.
В сад! :)А если базовый контроллер будет иметь ответственность прикладного назначения, как это обычно бывает, и нужно будет по разному обрабатывать прикладные ошибки? Нарушение SRP, не?
...
Рейтинг: 0 / 0
MVC: обработка исключения в контроллере
    #38766233
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAРешили не по стандарту ошибки обрабатыватьТо есть предоставление средой MVC мне возможности обрабатывать исключения - нестандарт?
skyANAсами и разбирайтесь :)Я бы поразбирался, но у меня нет опыта отладки на хостинге и с данным вопросом не знаю куда соваться.
Алексей К 16655639
?Shocker.ProbazileПотому что веб-сервер используемый при отладке и полноценный IIS это две разных вещи.это-то я догадался, но что именно влияет? По моему пониманию, это вообще не должно было выйти за пределы MVC-шной и моей dll-ки и IIS-у должен быть отдан только готовый statuscode?
...
Рейтинг: 0 / 0
MVC: обработка исключения в контроллере
    #38766244
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProskyANAРешили не по стандарту ошибки обрабатыватьТо есть предоставление средой MVC мне возможности обрабатывать исключения - нестандарт?StatusCode 200 возвращать не стандарт.

Exception Handling in ASP.NET MVC
...
Рейтинг: 0 / 0
MVC: обработка исключения в контроллере
    #38766249
codearticles.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алексей КГлобальный обработчик системных ошибок надо делать через global.asax.
Забудь про global.asax, иначе MVC6 пошлет тебя далеко в лес.

Алексей КА прикладные ошибки лучше ловить фильтрами
Не принципиально.

Алексей КА если базовый контроллер будет иметь ответственность прикладного назначения, как это обычно бывает, и нужно будет по разному обрабатывать прикладные ошибки? Нарушение SRP, не?
Никаких по-разному, никаких прикладных назначений. Контроллеры все равны и подчиняются своему базовому классу - основа ООП. Все попрыгушки и мультики идут в сад.
...
Рейтинг: 0 / 0
MVC: обработка исключения в контроллере
    #38766253
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProАлексей К 16655639
?Shocker.Proпропущено...
это-то я догадался, но что именно влияет? По моему пониманию, это вообще не должно было выйти за пределы MVC-шной и моей dll-ки и IIS-у должен быть отдан только готовый statuscode?Имел ввиду версию IIS 7.5, 8.5 и т. п.
...
Рейтинг: 0 / 0
MVC: обработка исключения в контроллере
    #38766269
st_st
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КГлобальный обработчик системных ошибок надо делать через global.asax.

С этим как раз таки и проблема - обычные 404-ые ловит ( http://site.com/ghghghgh), а с точками в урле вообще в Application_Error() не попадает.
...
Рейтинг: 0 / 0
MVC: обработка исключения в контроллере
    #38766273
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
codearticles.ruАлексей КГлобальный обработчик системных ошибок надо делать через global.asax.
Забудь про global.asax, иначе MVC6 пошлет тебя далеко в лес.А MVC6 есть? Вот когда будет, тогда и будем. :-)

codearticles.ruАлексей КА прикладные ошибки лучше ловить фильтрами
Не принципиально.Принципиально! Нарушение SRP - худшее из бед! Предлагается прикручивать обработку ошибок не наследованием, а композицией.

codearticles.ruАлексей КА если базовый контроллер будет иметь ответственность прикладного назначения, как это обычно бывает, и нужно будет по разному обрабатывать прикладные ошибки? Нарушение SRP, не?
Никаких по-разному, никаких прикладных назначений.Базовый контроллер для, например, типового CRUD делать не надо?

codearticles.ruКонтроллеры все равны и подчиняются своему базовому классу - основа ООП. Все попрыгушки и мультики идут в сад.Это одно из типовых решений, называемое Layer Superclass, но не об этом сейчас. :-)
...
Рейтинг: 0 / 0
MVC: обработка исключения в контроллере
    #38766277
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
st_stАлексей КГлобальный обработчик системных ошибок надо делать через global.asax.

С этим как раз таки и проблема - обычные 404-ые ловит ( http://site.com/ghghghgh), а с точками в урле вообще в Application_Error() не попадает.Если туда не попадает, значит в приложении обработать такую ошибку невозможно, если я ничего не путаю.
...
Рейтинг: 0 / 0
MVC: обработка исключения в контроллере
    #38766282
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
codearticles.ruКонтроллеры все равны и подчиняются своему базовому классу - основа ООП.

Опытный программист всегда предпочтёт агрегацию наследованию, аспект оверрайду. ООП как основа для архитектуры хороша только для узконаправленных библиотек и задач, напрямую отражающих наследование в своей логике. Основывать архитектуру приложения на ООП будет только новичёк, прочитавший одну из пропогандонских книжонок времён мамонта, или упоротый укурыш. Базовый контроллер как "центр вселенной" приложения это однозначная тухлятина. Тем более для таких вещей, как обработка ошибок и прокидывание сервисов.
...
Рейтинг: 0 / 0
MVC: обработка исключения в контроллере
    #38766295
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
st_stАлексей КГлобальный обработчик системных ошибок надо делать через global.asax.

С этим как раз таки и проблема - обычные 404-ые ловит ( http://site.com/ghghghgh), а с точками в урле вообще в Application_Error() не попадает.Хотя, может быть это ?
...
Рейтинг: 0 / 0
MVC: обработка исключения в контроллере
    #38766299
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttcodearticles.ruКонтроллеры все равны и подчиняются своему базовому классу - основа ООП.

Опытный программист всегда предпочтёт агрегацию наследованию, аспект оверрайду. ООП как основа для архитектуры хороша только для узконаправленных библиотек и задач, напрямую отражающих наследование в своей логике. Основывать архитектуру приложения на ООП будет только новичёк, прочитавший одну из пропогандонских книжонок времён мамонта, или упоротый укурыш. Базовый контроллер как "центр вселенной" приложения это однозначная тухлятина. Тем более для таких вещей, как обработка ошибок и прокидывание сервисов. +1234567890
...
Рейтинг: 0 / 0
25 сообщений из 406, страница 1 из 17
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / MVC: обработка исключения в контроллере
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]