От пыхи не убежишь

Добро пожаловать на Пыху!

Логин:
Пароль:
 

Нет прописки? Зарегистрируйся!

Новости

Пыха информатор 3.1
Еще более удобное оповещение о флуде!

Краснодарское время: 25 Май, 2012, 08:03:56

Страниц: [1]
Печать
Автор Тема: Целесообразность передачи исключений в методах.  (Прочитано 591 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Rotten    ↓ 
03 Май, 2011, 02:11:55
НЕ ХУЕТА! ХУЕТА!

Группа: Адекваты

Карма: 9
Сообщений: 2088
Сила слова: 0.43

Есть, например, клиентский метод в котором мы вызываем апишный метод из другого класса, который кидает исключение(специфическое какоето).
И вот если я хочу по логике кинуть  в клиентском методе то самое исключение в блоке catch, которое кидает апишный метод...
Тоесть так:
PHP

try{
 objectX.doSomething();
}catch(SpecificForObjectXException){
 throw new SpecificForObjectXException();
}
 

Короче говоря, насколько разумный с точки зрения проектирования такой подход? По сути - это делегирование исключния. По дефолту на месте повторного выкидыша исключения в клиенте должно быть всегда чтото другое.. Но вот если мне бы хотелось сохранить и передать то самое исключение так как по логике оно должно отображать суть того самого исключения.
 
P.S. Честно говоря то что я пробую - не совсем относится к пхп, ибо в случае пхп не надо было бы даже писать try-блок: исключение по цепи бы итак передалось. У меня ситуация, где try-блок писать обязательно т.к. IDE матерится и компилятор пошлет к черту.
Вопрос - скорее всего по базовой теории нежели суто по пхп..
Записан

Жизнь слишком коротка чтобы тратить ее на бестолковое внимание троллям, мудакам, задротам и прочим отбросам общества...
vasa_c    ↓ 
03 Май, 2011, 02:17:19 , спустя 5 минут 24 секунды
НЕ ХУЕТА! ХУЕТА!

Группа: в ухо

Карма: 81
Сообщений: 2459
Сила слова: 3.29

Что это? Ява?
 
В пыхе так:
PHP
} catch (Exception $e) {
   throw $e;
}
Записан

kostyl    ↓ 
03 Май, 2011, 02:33:34 , спустя 16 минут 15 секунд
НЕ ХУЕТА! ХУЕТА!

занедельный антипаттерн
Группа: Джедаи

Карма: 60
Сообщений: 3522
Сила слова: 1.7

надо кидат тоже самое исключение если тебе надо еще что то сделать, а так ризона нет
Записан

качество жизни обратно пропорционально количеству лени
Timur    ↓ 
03 Май, 2011, 03:52:16 , спустя 1 час 18 минут 42 секунды
НЕ ХУЕТА! ХУЕТА!

NullPointerException
Группа: в ухо

Карма: 56
Сообщений: 1009
Сила слова: 5.55

Если это Java, то почему бы добавить к сигнатуре метода throws?
Java

void someMethod() throws SpecificForObjectXException {
  objectX.doSomething();
}
 

upd
хотя throws по-любому понадобится, если только SpecificForObjectXException не наследует RuntimeException
 
и вообще это и на Java не похоже
Text
}catch(SpecificForObjectXException){ // где переменная?
« Последнее редактирование: 03 Май, 2011, 03:52:01 от Timur » Записан
master    ↓ 
03 Май, 2011, 03:49:30 , спустя
НЕ ХУЕТА! ХУЕТА!

Квадратов сколько видишь ты?
Группа: Джедаи

Карма: 44
Сообщений: 2080
Сила слова: 2.12

Исключения можно наследовать:
 
PHP

 
class DataBaseException extends Exception {}
 
class RowNotFoundException extends DataBaseException {}
 
try {
  foo();
} catch (DataBaseException $e){
 print 'проблема с чтением данных';
} catch (Exception $e){
 // какая-то ещё проблема
}
 

function foo(){
  try {
    readRow();
  } catch {RowNotFoundException $e} {
    print 'строка не найдена';
    throw $e;
  }
}
 
function readRow(){
  if (...) {
    throw new RowNotFoundException;
  }
}
 

будет напечатано:
строка не найдена
проблема с чтением данных
Записан

Rotten    ↓ 
03 Май, 2011, 04:50:26 , спустя 1 час 56 секунд
НЕ ХУЕТА! ХУЕТА!

Группа: Адекваты

Карма: 9
Сообщений: 2088
Сила слова: 0.43

Timur, да, на джаве.. а не похоже на джаву ибо писал в коде из пхп.. чето протупил сразу джаву выбрать, но тем не менее..
во-вторых(ближе к делу). Твое решение неплохое... но только на 1й взгляд, потому как это не избавляет нас обрамлять вызов objectX.doSomething(); в блок try/catch(потомучто если иде/компилятор знает о том что оно кидается этим исключением, то он ничего и не выполнит).
Отсюда - у нас остается все тот же блок catch в котором надо чтото сделать..
Java
void someMethod() throws SpecificForObjectXException {
try{
  objectX.doSomething();
}catch (specificException e){
 // тоесть здесь можно ничего не писать икомпилятор поймет что в случае исключения
 // нужно выбросить specificException ?
}
 
Записан

Жизнь слишком коротка чтобы тратить ее на бестолковое внимание троллям, мудакам, задротам и прочим отбросам общества...
Абырвалг    ↓ 
03 Май, 2011, 05:03:34 , спустя 13 минут 8 секунд
НЕ ХУЕТА! ХУЕТА!

PHP Infected, симфоеб, маконенавистник
Группа: Джедаи

Карма: 80
Сообщений: 6096
Сила слова: 1.31

довольно распространенная практика: ловим исключение и бросаем другое, а то, что словили - третьим агрументов в констроуктор ($previous, >= 5.3 only)
Записан

PHP does the job since 1995
Пожалуйста, не надо делать двойные клики по ссылкам. Это создает избыточную нагрузку на сервер
Timur    ↓ 
03 Май, 2011, 05:25:21 , спустя 21 минуту 47 секунд
НЕ ХУЕТА! ХУЕТА!

NullPointerException
Группа: в ухо

Карма: 56
Сообщений: 1009
Сила слова: 5.55

Отсюда - у нас остается все тот же блок catch в котором надо чтото сделать..
Да там вообще try/catch не нужен.
Просто допиши throws после списка аргументов и всё - исключение пойдет наверх по стеку вызовов, в поисках первого подходящего catch-блока.
 
http://www.skipy.ru/technics/exceptions.html
Спустя 4 минуты 45 секунд добавил
довольно распространенная практика: ловим исключение и бросаем другое, а то, что словили - третьим агрументов в констроуктор ($previous, >= 5.3 only)

Ну можно и так (в Java вторым аргументом), если есть необходимость, например добавить что-то к данному эксцепшену или "сгруппировать" несколько.
Записан
Timur    ↓ 
03 Май, 2011, 05:32:48 , спустя 7 минут 27 секунд
НЕ ХУЕТА! ХУЕТА!

NullPointerException
Группа: в ухо

Карма: 56
Сообщений: 1009
Сила слова: 5.55

потомучто если иде/компилятор знает о том что оно кидается этим исключением, то он ничего и не выполнит
Потому что в Java все исключения (кроме RuntimeException, Error и их наследников) являются проверяемыми (checked), т.е. если в методе возможно исключение, то его нужно либо обработать (try/catch), либо явно указать о том, что метод выбрасывает исключение (throws).
Записан
Rotten    ↓ 
03 Май, 2011, 05:33:12 , спустя 24 секунды
НЕ ХУЕТА! ХУЕТА!

Группа: Адекваты

Карма: 9
Сообщений: 2088
Сила слова: 0.43

Timur, ок, спасибо..
Записан

Жизнь слишком коротка чтобы тратить ее на бестолковое внимание троллям, мудакам, задротам и прочим отбросам общества...
kostyl    ↓ 
03 Май, 2011, 06:31:38 , спустя 58 минут 26 секунд
НЕ ХУЕТА! ХУЕТА!

занедельный антипаттерн
Группа: Джедаи

Карма: 60
Сообщений: 3522
Сила слова: 1.7

но зачем вызвать тот же эксцепшн и ничего не делать я так и не понял...
Записан

качество жизни обратно пропорционально количеству лени
Rotten    ↓ 
03 Май, 2011, 08:07:26 , спустя 1 час 35 минут 48 секунд
НЕ ХУЕТА! ХУЕТА!

Группа: Адекваты

Карма: 9
Сообщений: 2088
Сила слова: 0.43

kostyl, есть просто случай где в том блоке по цепочке высше(методу который вызвал клиент, в свою очередь) нужно кинуть ексцепшн того же характера, (без изменений) который относится к апишному методу... Например если апишный может кидать IllegalArgumentException/IllegalStateException, то клиент, в свою очередь являясь лишь составной частью вызова целой цепочки методов из разных классов должен передать высше то исключение, чтобы прекратить работу в случае высшеописанного исключения... а не просто выйти по типу return.
 
Была идея(очень плохая), исходя из того что апишный метод может кидать 3-4 исключения, то в клиентском методе реализовать возвращаемые числа соответствующие тем исключениям. Тоесть если у нас в клиете -  IllegalArgumentException, то он буде возвращать -1, если IllegalStateException - -2, и т.д...
Но идея потому и плоха, что раз мы долбим код в стиле ООП, то лчше придерживаться тех же исключений, но делегированных. Та и к тому же нужно дополнительно все расписать согласно документации - какие возвращаемые числа что значат, либо пообъявлять константы с соответствующими именами.. Нехорошо так...
Записан

Жизнь слишком коротка чтобы тратить ее на бестолковое внимание троллям, мудакам, задротам и прочим отбросам общества...
kostyl    ↓ 
04 Май, 2011, 11:58:40 , спустя 15 часов 51 минуту 14 секунд
НЕ ХУЕТА! ХУЕТА!

занедельный антипаттерн
Группа: Джедаи

Карма: 60
Сообщений: 3522
Сила слова: 1.7

Rotten, тогда наверно правильнее будет сделать так:
Java
try {
 objectX.doSomething();
}
catch (SpecificForObjectXException e) {
 throw e;
}
catch (Exception e) {
 // Do somethink
}
Записан

качество жизни обратно пропорционально количеству лени
Страниц: [1]
Печать
 

Перейти в:  

Этот топик скрыли: adw0rd