powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / зачем вообще этот throws в объявлении метода?
25 сообщений из 62, страница 2 из 3
зачем вообще этот throws в объявлении метода?
    #34766145
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
новичок_в_JavaТаким образом, если я правильно понял, throws это некий механизм самодокументирования кода возведённый до уровня обязательного синтаксического требования.

Никакой иной функциональности он не несёт и никаких обязательств на разработчика (кроме синтаксических) не накладывает.

Обладая этой информацией о вызываемых методах программист сам решает надо ли их обрабатывать (try-блок) или отправлять выше по call-стеку (писать throws).

Не вижу в этом ничего связанного с "защищённостью" языка или "идеологией ООП". Как ничто не мешает необработанному экцепшну спокойно долететь до вершины стека вызовов и предстать в виде "красивого окошка с красной иконкой".



Ну... здесь можно рассмотреть две крайности.

Крайность №1 Все методы объявляюься как throws Exception

Любая ситуация (потеря сетевого коннекта) вызывает откат стека до самой вершины с выбросом в консоль трассы методов. Например: IOException в сервлете "валит" WEB-сервер.

Крайность №2 Все методы содержат захват и подавление любых видов исключений.

Внешне такой код работает превосходно, но кодить его достаточно сложно, ибо не всегда можно определить реакцию вашего софта на исключения (их может быть от десятка до нескольких сотен), да и отлавливать ошибки в таком исходнике неудобно.

Короче, необходимо искать золотую середину и определится с протоколом исключений. Сам-же протокол - это предмет многочисленных договорённостей (или контрактов) между группами разработчиков. И его следует выносить на обсуждение. Это нормальная практика для разработки различных tier в бизнес-логике.
...
Рейтинг: 0 / 0
зачем вообще этот throws в объявлении метода?
    #34766184
Фотография 1024
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторИ что имеем в результате? Метод бросает исключение, а программа не знает что с ним делать (разработчик не знал об исключении или не захотел его обрабатывать).

я думаю что стоит обратить внимание на ситуацию когда ваш метод бросает исключение а не чужой. Пример:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
 void  someMethod()  throws  PasswordInvalidException
{
  if (!checkPassword(...)
  {
    throw   new  PasswordInvalidException();
  }
}

в этом примере работа с исключениями это часть логики. Понятно что кроме PasswordInvalidException могут быть другие исключения, с сервером соединения нет или что ещё. И тот кто будет использовать ваш метод напишет что-то вроде

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
 try 
{
 someMethod();
}
 catch (PasswordInvalidException passwordInvalidException )
{
 System.err.println("Wrong password");
}
 catch (Throwable t)
{
 System.err.println("Shit happens");
}

Таким образом вы явно предупреждаете тех кто будет использовать ваш код о том какие могут быть ошибки и предлагаете это учесть. Хотя другие могут наплевать на ваши предупреждения и просто ловить Throwable. Я, кстати, так и делаю обычно.
...
Рейтинг: 0 / 0
зачем вообще этот throws в объявлении метода?
    #34766204
Зашедший
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1024Хотя другие могут наплевать на ваши предупреждения и просто ловить Throwable. Я, кстати, так и делаю обычно.
Круто! А теперь предлагаю на пару секунд задуматься, что будет в случае возникновения, к примеру, OutOfMemory. И как оно обрабатывает Error, а также чем Error отличается от Exception.
...
Рейтинг: 0 / 0
зачем вообще этот throws в объявлении метода?
    #34766211
Фотография 1024
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пусть лошадь думает. Я ж сказал, указывается разработчиком что может быть его собственное исключение. Кто-то может его использовать и обрабатывать, кто-то может забить. Это скорей элемент логики а не гарантия успешной отработки метода.
...
Рейтинг: 0 / 0
зачем вообще этот throws в объявлении метода?
    #34766213
Зашедший
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1024пусть лошадь думает. Я ж сказал, указывается разработчиком что может быть его собственное исключение. Кто-то может его использовать и обрабатывать, кто-то может забить. Это скорей элемент логики а не гарантия успешной отработки метода.
Error, в отличие от Exception, элементом бизнес-логики не является, и забивать на него строго не рекомендуется.
...
Рейтинг: 0 / 0
зачем вообще этот throws в объявлении метода?
    #34766226
чего-чего?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Зашедший 1024пусть лошадь думает. Я ж сказал, указывается разработчиком что может быть его собственное исключение. Кто-то может его использовать и обрабатывать, кто-то может забить. Это скорей элемент логики а не гарантия успешной отработки метода.
Error, в отличие от Exception, элементом бизнес-логики не является, и забивать на него строго не рекомендуется.
не рекомендуется забивать на Error?
...
Рейтинг: 0 / 0
зачем вообще этот throws в объявлении метода?
    #34766229
Фотография 1024
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и?
...
Рейтинг: 0 / 0
зачем вообще этот throws в объявлении метода?
    #34766230
Зашедший
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот цытато из JavaDocs:
Sun MicrosystemsAn Error is a subclass of Throwable that indicates serious problems that a reasonable application should not try to catch. Most such errors are abnormal conditions. The ThreadDeath error, though a "normal" condition, is also a subclass of Error because most applications should not try to catch it.

A method is not required to declare in its throws clause any subclasses of Error that might be thrown during the execution of the method but not caught, since these errors are abnormal conditions that should never occur.
...
Рейтинг: 0 / 0
зачем вообще этот throws в объявлении метода?
    #34766231
Фотография 1024
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и что?
...
Рейтинг: 0 / 0
зачем вообще этот throws в объявлении метода?
    #34766234
Зашедший
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чего-чего? Зашедший 1024пусть лошадь думает. Я ж сказал, указывается разработчиком что может быть его собственное исключение. Кто-то может его использовать и обрабатывать, кто-то может забить. Это скорей элемент логики а не гарантия успешной отработки метода.
Error, в отличие от Exception, элементом бизнес-логики не является, и забивать на него строго не рекомендуется.
не рекомендуется забивать на Error?
В смысле тупо глушить его нельзя. "Забивать" ака "перехватывать и писать в лог".
...
Рейтинг: 0 / 0
зачем вообще этот throws в объявлении метода?
    #34766235
и сравни с тем что ты сказал.
...
Рейтинг: 0 / 0
зачем вообще этот throws в объявлении метода?
    #34766237
Зашедший
В смысле тупо глушить его нельзя. "Забивать" ака "перехватывать и писать в лог".
зачем вообще перехватывать Error?
...
Рейтинг: 0 / 0
зачем вообще этот throws в объявлении метода?
    #34766238
Зашедший
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а теперь ответь на вопрос Зашедший
В смысле тупо глушить его нельзя. "Забивать" ака "перехватывать и писать в лог".
зачем вообще перехватывать Error?
Именно что незачем. Я как раз и написал, что код типа catch(Throwable) - это, мягко говоря, неверно. Перехватывать можно (и часто нужно) Exception, но никак не Error, а в случае с Throwable они тоже будут перехвачены.
...
Рейтинг: 0 / 0
зачем вообще этот throws в объявлении метода?
    #34766242
Фотография 1024
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну добавь в

cath(Error e)
{
throw e;
}

сути это не меняет. Исключения это не гарантия что вс отработает а элемент логики. Можно объявить и те кто будет использовать смогут поймать и обработать. Если захотят.
...
Рейтинг: 0 / 0
зачем вообще этот throws в объявлении метода?
    #34766251
1024
сути это не меняет.
что полезного в этой конструкции?
...
Рейтинг: 0 / 0
зачем вообще этот throws в объявлении метода?
    #34766260
Зашедший
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
етитская сила! 1024
сути это не меняет.
что полезного в этой конструкции?
"Пацаны на раёне говорят, что так круче"(с)
...
Рейтинг: 0 / 0
зачем вообще этот throws в объявлении метода?
    #34766266
Фотография 1024
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полезного нет. Но раз в хелпе написано что Еррор нежелательно обрабатывать то можно передать его наверх.

Вопрос был: зачем вообще этот throws в объявлении метода?

я написал зачем. Какие-то тонкости или несоответствия - да, есть. Где их нет.
...
Рейтинг: 0 / 0
зачем вообще этот throws в объявлении метода?
    #34766280
Зашедший етитская сила! 1024
сути это не меняет.
что полезного в этой конструкции?
"Пацаны на раёне говорят, что так круче"(с)
на раёне по.уй как то ;)
...
Рейтинг: 0 / 0
зачем вообще этот throws в объявлении метода?
    #34766304
Зашедший
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1024полезного нет. Но раз в хелпе написано что Еррор нежелательно обрабатывать то можно передать его наверх.

Вопрос был: зачем вообще этот throws в объявлении метода?

я написал зачем. Какие-то тонкости или несоответствия - да, есть. Где их нет.
Я заинтересовался целью объявления catch(Throwable) вместо catch(Exception), так как ч0ткие методы могут только Exception бросать. Или есть необходимость обрабатывать StackOverflow & OutOfMemory?
...
Рейтинг: 0 / 0
зачем вообще этот throws в объявлении метода?
    #34766309
Фотография 1024
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
catch(OutOfMemoryError ooe)
{
System.err.println("дать писты разработчикам, опять ликов наоставляли");
throw ooe;
}
catch(LinkageError le)
{
System.err.println("удод, настрой пути к либам");
throw le;
}

как пример.

Но это офтоп.
...
Рейтинг: 0 / 0
зачем вообще этот throws в объявлении метода?
    #34766552
vas0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
по моему писать

Код: plaintext
1.
2.
 public   void  someMethod()  throws  Exception {
    ...      
}
смысла никакого нет, о чем говорит эта сигнатура. В моем могут произойти любые ошибки, ждите чего угодно. И как это что угодно обработать? Только на уровне контейнера, или какого нибудь диспетчер сервлета сказать: "Ну чувак извени фигня вышла".

Код: plaintext
1.
2.
3.
4.
5.
 public   void  someMethod() {
         try  {

        }  catch (Exception e) {
        }
}
Ну и писать один catch тоже очень опасно, может прилететь исключение, которое и обработать вы толком не сможете, так как вы его не ожидали
...
Рейтинг: 0 / 0
зачем вообще этот throws в объявлении метода?
    #34767460
Leonidv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1024
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
 void  someMethod()  throws  PasswordInvalidException
{
  if (!checkPassword(...)
  {
    throw   new  PasswordInvalidException();
  }
}

А могут ли быть исключения частью логики? Как мне кажется, в вашем примере лучше отдельно оговорить, что пароль является правильным. И выбрасывать непроверяемое исключение.
...
Рейтинг: 0 / 0
зачем вообще этот throws в объявлении метода?
    #34767537
Фотография 1024
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну, зачем же они тогда нужны если их не кидать, не ловить и не обрабатывать?
...
Рейтинг: 0 / 0
зачем вообще этот throws в объявлении метода?
    #34767538
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зашедший
Во-первых, слова "метод" я там не заметил, только слово "класс".

Можно пример класса в котором несколько методов и один на весь класс блок try/catch?
...
Рейтинг: 0 / 0
зачем вообще этот throws в объявлении метода?
    #34767607
Фотография 1024
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторВо-вторых обрабатывать все ошибки используя единственную и пустую секцию catch (Exception) - за такое в продакшн-коде надо сразу увольнять. Хуже только вариант с catch(Throwable) - как пример абсолютной и неизлечимой клиники.

мне кажется нада менее категорично заявлять что можно а что нельзя. Мир широк. Пример:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Color c=Color.black
 try {
c=parseColor(stringValueOfColor);
}{ catch (Throwable t){
//ну, не так цвет определили, конфиг может не там лежит, хрен с ним, пусть тогда будет чёрный
//ну, в консоль на всякий что-нить ругнём
t.printStackTrace();
//а, не, лучше пусть зелёный
c=Color.green
}
 return  c;
...
Рейтинг: 0 / 0
25 сообщений из 62, страница 2 из 3
Форумы / Java [игнор отключен] [закрыт для гостей] / зачем вообще этот throws в объявлении метода?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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