Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) Как обрабатывать исключительные ситуации?? (число прочтений - 6752 )
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Как обрабатывать исключительные ситуации??
03. Августа 2006 :: 11:02
Печать  
Я в классе выбрасываю исключение процедурой _ВыброситьИскл();
Как мне в обработчике Попытка/Исключение/КонецПопытки определить какое это исключение: стандартное 1С-ское или мое?
Это нужно , чтобы можно было корректно выдать на экран описание ошибки, для стандартного исключения описание ошибки надо получать функцией "ОписаниеОшибки()", а для своего исключения надо делать что-то другое.
  
Наверх
ICQ  
IP записан
 
Палыч
1c++ power user
Отсутствует


I Love 1Cv8!

Сообщений: 217
Зарегистрирован: 19. Мая 2006
Re: Как обрабатывать исключительные ситуации??
Ответ #1 - 03. Августа 2006 :: 15:41
Печать  
Рекомендую исключения платформы и исключения классов 1С++ обрабатывать на разных уровнях. Т.е. исключения платформы обрабатвать там, где могут возникнуть только они, а затем, при необходимости, повторно выбрасывать свое исключение со вложенным описанием исключения платформы.
  
Наверх
ICQ  
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Как обрабатывать исключительные ситуации??
Ответ #2 - 04. Августа 2006 :: 04:16
Печать  
Так наверно возможно сделать, но это слишком усложнит логику программы.
Гораздо проще в одном обработчике исключений обрабатывать оба типа исключения, и это возможно и нормально работает, единственная проблема - корректно получить описание ошибки.
Это больше вопрос к уважаемым разработчикам 1С++, но они что-то молчат Печаль
  
Наверх
ICQ  
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: Как обрабатывать исключительные ситуации??
Ответ #3 - 04. Августа 2006 :: 05:26
Печать  
Используй ВыполняемыйМодуль::ПолучитьИсключение
  
Наверх
 
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Как обрабатывать исключительные ситуации??
Ответ #4 - 04. Августа 2006 :: 05:38
Печать  
Спасибо,
Но  этом случае я получу объект исключения, которое я сам выбросил функцией "_ВыброситьИскл". А что я получу, если это стандартное исключение?
И можно , пожалуйста, привести короткий примерчик?
  
Наверх
ICQ  
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Как обрабатывать исключительные ситуации??
Ответ #5 - 04. Августа 2006 :: 08:42
Печать  
И еще вопрос. Как в классе получить объект исключения? Тоже через класс "ВыполняемыйМодуль"? Было бы логично в классе сделать процедуру "_ПолучитьИскл", раз уж сделали "_ВыброситьИскл"
  
Наверх
ICQ  
IP записан
 
alexqc
Junior Member
**
Отсутствует



Сообщений: 77
Местоположение: АР Крым, Симферополь
Зарегистрирован: 21. Июня 2006
Пол: Мужской
Re: Как обрабатывать исключительные ситуации??
Ответ #6 - 04. Августа 2006 :: 08:43
Печать  
es3000 писал(а) 04. Августа 2006 :: 05:38:
Спасибо,
Но  этом случае я получу объект исключения, которое я сам выбросил функцией "_ВыброситьИскл". А что я получу, если это стандартное исключение?
И можно , пожалуйста, привести короткий примерчик?


А что, сложно проверить?
Пустой объект (у которого ТИпЗначения()=0)
Кстати, и это вполне логично можно было предположить.

2Палыч - обрабатывать исключения платформы в месте их возникновения - конечно вариант, но противоречит логике исключений: исключения обрабатываются там, где их можно обработать, обработчик распознает "свои" исключения, а остальное - кидает дальше. А так мы на каждый чих делаем обработчик, единственная цель которого - кинуть исключение следующему. Так почему бы вторым обработчиком и не ограничится???
  

Везде - от моря Черного до снежной Колымы - мы трудностям показываем кукиш.
Наверх
 
IP записан
 
sedmin
1c++ developer
Отсутствует


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Re: Как обрабатывать исключительные ситуации??
Ответ #7 - 04. Августа 2006 :: 08:45
Печать  
Поддерживаю. С одним замечанием.

Методы должны называться ВыброситьИсключение() и ПолучитьИсключение(). И должны быть одинаковыми в ВыполняемомМодуле и в КОП.

И еще бы сделать такой метод, который бы содержал в себе такую вещь:
Код
Выбрать все
Исключение
   Искл=Сам.ПолучитьИсключение();
   Если ТипЗначениеСтр(Искл)<>"МоеИсключение" Тогда
	Ошибка=ОписаниеОшибки();
	Сам.ВыброситьИсключение(Искл, Ошибка);
   КонецЕсли;
КонецПопытки 

  
Наверх
 
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Как обрабатывать исключительные ситуации??
Ответ #8 - 04. Августа 2006 :: 09:35
Печать  
ALEXQC:
Насчет проверки я уже сам додумался, но все равно спасибо

Всем:
Желать лучшего - это хорошо Улыбка
Но вот все-таки в существующей ситуации на данный момент как правильно писать обработчики исключений?

Код
Выбрать все
Исключение
    Мод = СоздатьОбъект("ВыполняемыйМодуль")
    Мод.ПрисоединитьТекущийМодуль()
    Искл = Мод.ПолучитьИсключение()
    ....
КонецПопытки
 



Так правильно будет?
Каждый раз создавать новый объект в каждом обработчике мне кажется не совсем правильно, может у кого еще какие идеи?
  
Наверх
ICQ  
IP записан
 
sedmin
1c++ developer
Отсутствует


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Re: Как обрабатывать исключительные ситуации??
Ответ #9 - 04. Августа 2006 :: 11:07
Печать  
Третья (вторая) строчка не нужна. Достаточно
Код
Выбрать все
Мод = СоздатьОбъект("ВыполняемыйМодуль");
Искл = Мод.ПолучитьИсключение();  

  
Наверх
 
IP записан
 
alexqc
Junior Member
**
Отсутствует



Сообщений: 77
Местоположение: АР Крым, Симферополь
Зарегистрирован: 21. Июня 2006
Пол: Мужской
Re: Как обрабатывать исключительные ситуации??
Ответ #10 - 04. Августа 2006 :: 12:37
Печать  
sedmin писал(а) 04. Августа 2006 :: 08:45:
Поддерживаю. С одним замечанием.

Методы должны называться ВыброситьИсключение() и ПолучитьИсключение(). И должны быть одинаковыми в ВыполняемомМодуле и в КОП.

Ну да, и еще бы параметры одинаковые иметь.


[/quote]
И еще бы сделать такой метод, который бы содержал в себе такую вещь:
Код
Выбрать все
Исключение
   Искл=Сам.ПолучитьИсключение();
   Если ТипЗначениеСтр(Искл)<>"МоеИсключение" Тогда
	Ошибка=ОписаниеОшибки();
	Сам.ВыброситьИсключение(Искл, Ошибка);
   КонецЕсли;
КонецПопытки 

[/quote]

Не понял, метод который сам распознает и транслирует исключения? ИМХО, это как раз лишнее - логику исключений определяет разработчик класса, и подобные методы с ней могут не совпадать. К тому же, как планируется его использование? Так:

Код
Выбрать все
Исключение
   // Если тип исключения не совпадает с указанным - кидаем дальше
    Сам.ПропуститьИсключение("МоеИсключение");
    // а вот если соавдает - обрабатываем
КонецПопытки 



ИМХО, хоть и в 1 строчку, но не наглядно.

К тому же у самой 1С есть оператор ВызватьИсключение, правда, работающий только внутри обработчика.
Им можно заменить конструкцию
Ошибка=ОписаниеОшибки();Сам.ВыброситьИсключение(Искл, Ошибка);

Тогда получим что-то типа:

Код
Выбрать все
  Искл=Сам.ПолучитьИсключение();
  ТипИскл=ТипЗначениеСтр(Искл);
   Если  ТипИскл="МоеИсключение1" Тогда
	   //Обработка одного типа исключения
   ИначеЕсли  ТипИскл="МоеИсключение2" Тогда
	  //Обработка другого типа исключения
   Иначе
	 ВызватьИсключение; //1Совское или нераспознанное исключение - не обрабатаваем
   КонецЕсли;

 

  

Везде - от моря Черного до снежной Колымы - мы трудностям показываем кукиш.
Наверх
 
IP записан
 
Палыч
1c++ power user
Отсутствует


I Love 1Cv8!

Сообщений: 217
Зарегистрирован: 19. Мая 2006
Re: Как обрабатывать исключительные ситуации??
Ответ #11 - 04. Августа 2006 :: 16:05
Печать  
alexqc писал(а) 04. Августа 2006 :: 08:43:
2Палыч - обрабатывать исключения платформы в месте их возникновения - конечно вариант, но противоречит логике исключений: исключения обрабатываются там, где их можно обработать, обработчик распознает "свои" исключения, а остальное - кидает дальше. А так мы на каждый чих делаем обработчик, единственная цель которого - кинуть исключение следующему. Так почему бы вторым обработчиком и не ограничится???


Не вижу противоречия.
"Best practices" использования исключений разжованы во многих букварях, так что изобретать велосипед не вижу смысла. Например у С. Макконнелла в "Совершенном коде" (гл. 8.4). Суть вкратце: исключения должны быть частью интерфейса. Для чего? Для того, чтобы скрыть детали реализации класса! Если исключение происходит в агрегированном объекте, значит нужно это исключение обработать внутри класса и, при необходимости, выбросить наружу новое исключение, являющееся частью его [этого класса] интерфейса.
Это что касается теории.

Теперь о практике. Кто-то может привести пример, когда исключения платформы требуют структурированной обработки?
  
Наверх
ICQ  
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как обрабатывать исключительные ситуации??
Ответ #12 - 04. Августа 2006 :: 16:08
Печать  
Палыч как всегда на высоте Улыбка
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать