Форум программистов, компьютерный форум, киберфорум
.NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
 Аватар для m0nax
1274 / 975 / 113
Регистрация: 12.01.2010
Сообщений: 1,971

Исключения которые можно обработать - кто они и где?

26.12.2015, 00:50. Показов 1988. Ответов 2

Студворк — интернет-сервис помощи студентам
в эфире интернетов витает правило хорошего тона
в любой ситуации которую метод не может корректно обработать надо бросать исключения наверх
вопрос - какие такие исключения которые можно обработать?
кроме банальщины вроде transaction.Rollback(), logger.Error(e) или какого-нибудь ObjectDisposed в методе Stop
Что еще??

то есть проще говоря, 95% исключений должны вылезать на высший уровень до падения приложения, т.к никто никогда их не обрабатывает всё равно

суть то в чем, если допустим мы используем библиотеку %libname%, вызываем некий метод и ожидаем исключений...
но погодите, ведь если автор библиотеки следовал правилу то "ожидаемых" исключений быть не может!
а во вторых никто кроме майкрософта не описывает ожидаемые исключения...

то есть всё, что ожидается и может быть обработано УЖЕ перехвачено и обработано
а то что не ожидается - а как же его обработать если оно не ожидается?

качаем допустим webclient страницу, оп ошибка, какая? http error code штук 50, делать switch по всем...пупок развяжется же (там еще забавные такие бывает типа еррор, а по факту редирект)
а если делать 2-3 варианта, то надежность такого метода всё равно на нуле

в итоге логика:
метод должен скачать страницу, не смог - throw
метод ждал страницу чтоб обработать, ему бросили exception, что делать? throw!
метод ожидал пока страница качается и обработается, ему дали exception...throw!
throw...throw! throw!
appdomain.unhandledexception
состояние приложения неопределенно, close....

а смысл тогда вообще что-либо перехватывать? зачем вообще вся эта система try-catch?

допустим вызываем некий SaveToDB, а там на сервере перегруз, памяти нет или диск бэдами покрылся, хлоп прилетела ошибка.
и что дальше? вот у нас Exception..хз что в нем, хз откуда он, хз когда это пройдет
нужен ли rollback, не будет ли в нем тоже исключений? а они бывают!!!
ну да можно сделать механизм "повторного сохранения" в базу...но это уже довольно мудреные конструкции которые могут затронуть всё нутро приложения и нужны очень мало где

или допустим пишем в файл, а тут хлоп оказывается места нет, слабо вспомнить какой exception выпадет?
вот и я не помню, а может и сроду не знал никогда, но как же его "обрабатывать" тогда?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
26.12.2015, 00:50
Ответы с готовыми решениями:

Подсчитать сумму элементов массива где они возрастают и сумму элементов где они убывают.Вычислить разность сумм
Задан случайный массив. Определить разность между суммой значений элементов массива на участках, где элементы монотонно возрастают(каждое...

Как правильнее обработать исключения?
Здарвствуйте. Хочу сделать так, чтобы кодировка программы задавалась пользователем явно(будь то параметр jvm или параметр приложения) . В...

Вычислить значение y=f(x,a) и обработать возможные исключения
Для данного варианта составить алгоритм счисления значения y=f(x,a), и реализировать его в виде функции. Значения Х и а задаются...

2
 Аватар для LeniumSoft
1454 / 847 / 150
Регистрация: 06.06.2012
Сообщений: 2,370
27.12.2015, 03:35
Лучший ответ Сообщение было отмечено m0nax как решение

Решение

Вы немного не поняли!

в любой ситуации которую метод не может корректно обработать надо бросать исключения наверх
Это можно перефразировать так: Вы всегда должны пробрасывать ошибки из своего кода! Вы не должны их проглатывать! Дабы разработчик, использующий ваш код, мог эти ошибки обработать на своём уровне.

Вы у себя можете сделать так:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class DataReader
    {
        public string Read(FileInfo file)
        {
            var result = string.Empty;
 
            try
            {
                //Тут читаем файл в переменную result
            }
            catch (Exception)
            {
                //тупо проглотили все ошибки.
            }
 
            return result;
        }
    }
Это очень плохо! Никто не узнает про ошибки.

Ну а по правилам нужно сделать так:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class DataReader
    {
        public string Read(FileInfo file)
        {
            var result = string.Empty;
 
            try
            {
                //Тут читаем файл в переменную result
            }
            catch (Exception ex)
            {
                //Конечно такой try catch тут бесполезен(даже Resharper мне его подчеркнул :) ), но 
                // возможно вам в своём коде надо обработать определённые ошибки или выплюнуть свои.
                throw ex;
            }
 
            return result;
        }
    }
Такой код даст возможность обработать любые ошибки выше. Это хорошо!
1
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
28.12.2015, 15:35
Цитата Сообщение от m0nax Посмотреть сообщение
какие такие исключения которые можно обработать?
Те, которые позволяют методу завершить возложенную на него задачу.

Например, есть у вас метод ReadWebPage с возвращаемым типом XmlDocument.
Это значит, что если я использую ваш метод, то ожидаю, что результатом его работы будет ссылка на XmlDocument. Я ставлю дальнейшую логику своего кода в зависимость от этой переменной.
Если по какой-либо причине считать страницу и создать необходимый мне объект не удалось, то это означает, что ваш метод неспособен в данной ситуации выполнить свою часть контракта (предоставить ссылку на объект), а следовательно и я дальше не могу продолжать запланированные действия.
То есть возникает типичная исключительная ситуация.

А вот если у вас метод называется, скажем, TryReadWebPage, который возвращает bool (как TryParse, ага), то контракт между мной и вами такой: вы пытаетесь скачать страницу и предоставить ссылку на XmlDocument. Результатом метода будет значение успеха операции. Значит, используя ваш метод, я буду строить логику своего приложения соответствующим образом, а вы внутри метода можете ловить что вашей душе угодно и возвращать false.

Цитата Сообщение от m0nax Посмотреть сообщение
суть то в чем, если допустим мы используем библиотеку %libname%, вызываем некий метод и ожидаем исключений...
но погодите, ведь если автор библиотеки следовал правилу то "ожидаемых" исключений быть не может!
а во вторых никто кроме майкрософта не описывает ожидаемые исключения...
то есть всё, что ожидается и может быть обработано УЖЕ перехвачено и обработано
а то что не ожидается - а как же его обработать если оно не ожидается?

а смысл тогда вообще что-либо перехватывать? зачем вообще вся эта система try-catch?
Если интересен реальный пример, то вот у меня есть с одной стороны контроллер автоматизации, а с другой стороны видео сервер.
Контроллер работает по протоколу VDCP (бинарный протокол через нуль-модем), а у видео сервера API через сокеты и XML-команды, обернутые в .NET-классы, предоставленные производителем. Напрямую они общаться не могут, значит мне нужно написать посредника, который получает команды от контроллера и передает их серверу.
Контроллер засылает команду PLAY CUE (подготовить клип к проигрыванию), при этом в ответ ожидает только код "принято", но каждые 40 мс (время 1 кадра при 25 fps) запрашивает статус, в который и входят всякие флаги об ошибках или об успешности операции.
Вот я получаю от него команду PLAY CUE с ID клипа, строю соответствующий XML-запрос и отсылаю его видео серверу. На сервере клип не найден, в этом случае метод API выбрасывает исключение, которое я перехватываю и устанавливаю в статусе бит ID NOT FOUND, который при следующем запросе и скармливаю контроллеру.
Или если соединение с сервером разорвалось и не может быть восстановлено, то я перехватываю эти исключения и устанавливаю в статусе флаг PORT DOWN.

Цитата Сообщение от m0nax Посмотреть сообщение
то есть проще говоря, 95% исключений должны вылезать на высший уровень до падения приложения, т.к никто никогда их не обрабатывает всё равно
Не обязательно на самый высший уровень (AppDomain.UnhandledException).
К примеру, если у вас приложение с интерфейсом, то перехватчики стоят в обработчиках всяких кнопок и показывают сообщение об ошибке.
Разумеется, если ошибка перехеривает всё состояние программы, то самый лучший метод — это именно завершение работы.

Цитата Сообщение от m0nax Посмотреть сообщение
качаем допустим webclient страницу, оп ошибка, какая? http error code штук 50, делать switch по всем...пупок развяжется же (там еще забавные такие бывает типа еррор, а по факту редирект)
Порой — да, приходится затягивать пупок и, грубо говоря, писать switch/case из 100500 ошибок.
Ну, это если вы не хотите, чтобы написанный вами браузер падал при 404.

Цитата Сообщение от m0nax Посмотреть сообщение
или допустим пишем в файл, а тут хлоп оказывается места нет, слабо вспомнить какой exception выпадет?
вот и я не помню, а может и сроду не знал никогда, но как же его "обрабатывать" тогда?
Что-то унаследованное от IOException.
Его и ловите
А вообще такие вещи должны выявляться на стадии тестирования.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.12.2015, 15:35
Помогаю со студенческими работами здесь

Обработать все исключения в одном месте
Приветствую всех. Сосбвенно, вопрос в названии темы. Приведу код, чтобы было более понятно. ... try { q = StrToInt(w); //...

Кто знает где можно скачать калькулятор по Windows XP?
Кто знает где можно скачать калькулятор по WINDOWS XP?

Где в Фейсбуке можно посмотреть кто заходил на страницу?
Здравствуйте, Где в Фейсбуке можно посмотреть кто заходил на страницу? Если это в нем возможно, подскажите пожалуйста, пока не нашел.

Кто знает где можно найти хелпу по win32/с++ ?
Убил два часа на потски в нете но находил только всякую фигню .Кто знает хорошие ссылки по этой теме киньте их пожалуйста .

Кто-то знает где можно найти симулятор андроида на ПК?
Всем привет , нужно найти средство что бы создавать симулятор андроида на пк, скрывать его работу (делать невидимым окно) и управлять...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru