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

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

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


Это плохая идея т.к. ошибки будут индексироваться поисковиками.
...
Рейтинг: 0 / 0
03.10.2014, 13:19
    #38766019
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MVC: обработка исключения в контроллере
bazileЭто плохая идея т.к. ошибки будут индексироваться поисковиками.не будут - это ответ на аякс-запрос.
bazileПотому что веб-сервер используемый при отладке и полноценный IIS это две разных вещи.это-то я догадался, но что именно влияет? По моему пониманию, это вообще не должно было выйти за пределы MVC-шной и моей dll-ки и IIS-у должен быть отдан только готовый statuscode
codearticles.ruПлохая практика.Почему? Исключения генерятся на различных уровнях, из репозитория, из BL, самим контроллером. Некоторое количество известных ситуаций обрабатывает контроллер и выдает пользователю более информативное сообщение, чем 500.
...
Рейтинг: 0 / 0
03.10.2014, 13:25
    #38766028
codearticles.ru
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MVC: обработка исключения в контроллере
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
03.10.2014, 13:31
    #38766037
st_st
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MVC: обработка исключения в контроллере
codearticles.ru,

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

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

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

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

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

?
...
Рейтинг: 0 / 0
03.10.2014, 15:35
    #38766227
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MVC: обработка исключения в контроллере
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
03.10.2014, 15:38
    #38766233
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MVC: обработка исключения в контроллере
skyANAРешили не по стандарту ошибки обрабатыватьТо есть предоставление средой MVC мне возможности обрабатывать исключения - нестандарт?
skyANAсами и разбирайтесь :)Я бы поразбирался, но у меня нет опыта отладки на хостинге и с данным вопросом не знаю куда соваться.
Алексей К 16655639
?Shocker.ProbazileПотому что веб-сервер используемый при отладке и полноценный IIS это две разных вещи.это-то я догадался, но что именно влияет? По моему пониманию, это вообще не должно было выйти за пределы MVC-шной и моей dll-ки и IIS-у должен быть отдан только готовый statuscode?
...
Рейтинг: 0 / 0
03.10.2014, 15:42
    #38766244
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MVC: обработка исключения в контроллере
Shocker.ProskyANAРешили не по стандарту ошибки обрабатыватьТо есть предоставление средой MVC мне возможности обрабатывать исключения - нестандарт?StatusCode 200 возвращать не стандарт.

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

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

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

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

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

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

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

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

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

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

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


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