Регистрация  |  Вход

Обработка исключения: что собственно делать?

Всем привет!

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

Итак,
Обработка исключения: что собственно нужно делать?

Когда-то давно, когда я впервые увидел try-catch мне показалось, что это нужно для предотвращения "падения" кода в момент выполнения в результате возникшей ошибки.

Но постепенно формировалось понимание, что в catch должно идти больше кода, чем только оповещение о ситуации.

И в конце концов в голове сформировался список возможных дейсвтий в процессе обработки исключения, организованный в три группы:

(1) это самом простое - "будь настойчив" - попробовать сделать то, что вызвало ошибку еще раз, и возможно до тех пор пока позволяют лимиты. С этим столкнулся при обработке неудачного колаута.

(2) оповещение о проблеме пользователя и\или админа и\или владельца кода.
- если есть пользователь - то ему выводятся сообщения на страницу.
- если его нет - то отправляются письма счастья для админа и\или владельца кода.

(3) выполнения каких-то специфичных действий по "проблемной" логике:
- перевод пользователя на др страницу (в т.ч. оставаясь на одном экземпляре контролерра) или рендеринг специальной секции на текущей странице, где пользователю предлагается предпринять какие действия по "проблемному" сценарию.
- выполнения каких то действия с записями в соответвие с проблемной ситацией, например перевод поля "Статус" в значение "Возникла ошибка при отправке" и апдатирование.

Это все что у меня накопилось по данному вопросу.
Пожалуйста, поделитесь своим опытом обработки исключений: что обычно вы делаете при этом, с какими редкими варинатми действий вам приходилось сталкиваться?

спасибо

Всем привет!

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

Итак,
Обработка исключения: что собственно нужно делать?

Когда-то давно, когда я впервые увидел try-catch мне показалось, что это нужно для предотвращения "падения" кода в момент выполнения в результате возникшей ошибки.

Но постепенно формировалось понимание, что в catch должно идти больше кода, чем только оповещение о ситуации.

И в конце концов в голове сформировался список возможных дейсвтий в процессе обработки исключения, организованный  в три группы:

(1) это самом простое - "будь настойчив" - попробовать сделать то, что вызвало ошибку еще раз, и возможно до тех пор пока позволяют лимиты. С этим столкнулся при обработке неудачного колаута.

(2) оповещение о проблеме пользователя и\или админа и\или владельца кода.
- если есть пользователь - то ему выводятся сообщения на страницу.
- если его нет - то отправляются письма счастья для админа и\или владельца кода.

(3) выполнения каких-то специфичных действий по "проблемной" логике:
- перевод пользователя на др страницу (в т.ч. оставаясь на одном экземпляре контролерра) или рендеринг специальной секции на текущей странице, где пользователю предлагается предпринять какие действия по "проблемному" сценарию.
- выполнения каких то действия с записями в соответвие с проблемной ситацией, например перевод поля "Статус" в значение "Возникла ошибка при отправке" и апдатирование.

Это все что у меня накопилось по данному вопросу.
Пожалуйста, поделитесь своим опытом обработки исключений: что обычно вы делаете при этом, с какими редкими варинатми действий вам приходилось сталкиваться?

спасибо

Привет! Рекомендую начать с этого

http://habrahabr.ru/company/golovachcourses/blog/223821/

Да это Java, но общее понимание матчасти должно быть

Привет! Рекомендую начать с этого

[url]http://habrahabr.ru/company/golovachcourses/blog/223821/[/url]

Да это Java, но общее понимание матчасти должно быть

Art Vegas
Привет! Рекомендую начать с этого

http://habrahabr.ru/company/golovachcourses/blog/223821/

Да это Java, но общее понимание матчасти должно быть

прочитал мат часть - интересно и подробно описано.

[quote="Art Vegas"]Привет! Рекомендую начать с этого

[url]http://habrahabr.ru/company/golovachcourses/blog/223821/[/url]

Да это Java, но общее понимание матчасти должно быть[/quote]

прочитал мат часть - интересно и подробно описано.

Вот здесь более детально уже только про Apex.

https://developer.salesforce.com/page/An_Introduction_to_Exception_Handling

Вот здесь более детально уже только про Apex.

[url]https://developer.salesforce.com/page/An_Introduction_to_Exception_Handling[/url]

все почитал, но один вопрос остался, причем он из учебника по Андройд:

byte[] downloadFile() throws InterruptedException {
TimeUnit.SECONDS.sleep(2);
return new byte[1024];
}

и где-то мы это используем и ловим этот InterruptedException

try {

file = downloadFile();

} catch (InterruptedException e) {
e.printStackTrace();
}

но зачем мы пишем слова throws InterruptedException, ведь это исключение все равно вылетит из функции в случае ошибки?
кроме того я не уверен, что throws используется в APEX...

все почитал, но один вопрос остался, причем он из учебника по Андройд:

[code] byte[] downloadFile() throws InterruptedException {
    TimeUnit.SECONDS.sleep(2);
    return new byte[1024];
  }[/code]

и где-то мы это используем и ловим этот InterruptedException
[code]try {

file = downloadFile();

} catch (InterruptedException e) {
          e.printStackTrace();
        }[/code]

но зачем мы пишем слова [b]throws InterruptedException[/b], ведь это исключение все равно вылетит из функции в случае ошибки? 
кроме того я не уверен, что [b]throws [/b]используется в APEX...

Как-то встречал такое, если не ошибаюсь throws используется чтобы показать какой тип ошибки может появиться внутри метода.
Такой синтаксис не используется в Salesforce.

Как-то встречал такое, если не ошибаюсь throws используется чтобы показать какой тип ошибки может появиться внутри метода.
Такой синтаксис не используется в Salesforce.

Den Brown
все почитал, но один вопрос остался, причем он из учебника по Андройд:

byte[] downloadFile() throws InterruptedException {
TimeUnit.SECONDS.sleep(2);
return new byte[1024];
}

и где-то мы это используем и ловим этот InterruptedException

try {

file = downloadFile();

} catch (InterruptedException e) {
e.printStackTrace();
}

но зачем мы пишем слова throws InterruptedException, ведь это исключение все равно вылетит из функции в случае ошибки?
кроме того я не уверен, что throws используется в APEX...

В java, класс исключения указывается (обязательно) после метода, что бы показать, что данный метод может вызывать данное исключение, может быть несколько классов, причём они должны располагаться сверху вниз по иерархии наследования. Что бы не указывать класс исключения, его можно обработать в try-catch в самом методе.

[quote="Den Brown"]все почитал, но один вопрос остался, причем он из учебника по Андройд:

[code] byte[] downloadFile() throws InterruptedException {
    TimeUnit.SECONDS.sleep(2);
    return new byte[1024];
  }[/code]

и где-то мы это используем и ловим этот InterruptedException
[code]try {

file = downloadFile();

} catch (InterruptedException e) {
          e.printStackTrace();
        }[/code]

но зачем мы пишем слова [b]throws InterruptedException[/b], ведь это исключение все равно вылетит из функции в случае ошибки? 
кроме того я не уверен, что [b]throws [/b]используется в APEX...[/quote]

В java, класс исключения указывается (обязательно) после метода, что бы показать, что данный метод может вызывать данное исключение, может быть несколько классов, причём они должны располагаться сверху вниз по иерархии наследования. Что бы не указывать класс исключения, его можно обработать в try-catch в самом методе.

dlisovsky
В java, класс исключения указывается (обязательно) после метода, что бы показать, что данный метод может вызывать данное исключение

а если я не укажу, что этот метод вызывает данное исключение, то что от этого изменится? я не смогу его словить в коде вызвавшем этот метод? или указание типа возможного исключения носит справочный характер для самих программистов, чтобы они знали, что именно может вылететь из этого метода?


dlisovsky
Что бы не указывать класс исключения, его можно обработать в try-catch в самом методе.

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

спасибо

[quote="dlisovsky"]
В java, класс исключения указывается (обязательно) после метода, что бы показать, что данный метод может вызывать данное исключение[/quote]

а если я не укажу, что этот метод вызывает данное исключение, то что от этого изменится? я не смогу его словить в коде вызвавшем этот метод? или указание типа возможного исключения носит справочный характер для самих программистов, чтобы они знали, что именно может вылететь из этого метода?


[quote="dlisovsky"]
Что бы не указывать класс исключения, его можно обработать в try-catch в самом методе.[/quote]
как я понял, в утилити (вспомогательных) методах исключения не обрабатываются для того, чтобы можно было словить их в  вызвавшем коде и обработать в соответствии с логикой этого кода. Правильно?

спасибо

Всем привет!

хочу в этой теме обсудить следущий вопрос:

использования try-catch для ветвления основной логики, а не для обработки ситуаций исключений.

вижу такой код:

try в котором на первой строке пытаются выкверить запись (если она нашлась - то что-то с ней делают далее), а если на этой первой строке ничего не находится и код выпаает в исключение - в catch создается новая запись и идет соответствующая логика.

Это нормально?

я бы выкверил в Лист, проверил его сайз, и от этого ветвил бы логику. Но с try-catch то короче получается...

Всем привет!

хочу в этой теме обсудить следущий вопрос:

использования try-catch для ветвления основной логики, а не для обработки ситуаций исключений.

вижу такой код:

try в котором на первой строке пытаются выкверить запись (если она нашлась  - то что-то с ней делают далее), а если на этой первой строке ничего не находится и код выпаает в исключение - в catch создается новая запись и идет соответствующая логика.

Это нормально?

я бы выкверил в Лист, проверил его сайз, и от этого ветвил бы логику. Но с try-catch то короче получается...

Den Brown
Это нормально?

Это абсолютно ненормально. Я часто такое в чужом коде встречаю. Меня лично это очень расстраивает. try catch имеет другое предназначение, чем проверка наличия записи в базе. К тому же не уверен (не знаю как проверить), но мне кажется что try catch "дорогая" процедура и вот так раскидываться ей по пустякам "дороговато" для кода.

[quote="Den Brown"]Это нормально?[/quote]
Это абсолютно ненормально. Я часто такое в чужом коде встречаю. Меня лично это очень расстраивает. try catch имеет другое предназначение, чем проверка наличия записи в базе. К тому же не уверен (не знаю как проверить), но мне кажется что try catch "дорогая" процедура и вот так раскидываться ей по пустякам "дороговато" для кода.

Den Brown
кроме того я не уверен, что throws используется в APEX...

Постоянно генерю кастомные эксепшены!

[quote="Den Brown"]кроме того я не уверен, что throws используется в APEX...[/quote]
Постоянно генерю кастомные эксепшены!

Dmitry Shnyrev
но мне кажется что try catch "дорогая" процедура и вот так раскидываться ей по пустякам "дороговато" для кода.

Причем ОЧЕНЬ дорогая

[quote="Dmitry Shnyrev"] но мне кажется что try catch "дорогая" процедура и вот так раскидываться ей по пустякам "дороговато" для кода.[/quote]
Причем ОЧЕНЬ дорогая

Gres
Постоянно генерю кастомные эксепшены!

А зачем? Какое практическое применение?

[quote="Gres"]Постоянно генерю кастомные эксепшены![/quote]
А зачем? Какое практическое применение?

Dmitry Shnyrev
А зачем? Какое практическое применение?

А в чем ты думаешь смысл исключений?
Показать, что что-то пошло не так, есть какая-то ошибка в бизнес-процессе.

[quote="Dmitry Shnyrev"]А зачем? Какое практическое применение? [/quote]
А в чем ты думаешь смысл исключений?
Показать, что что-то пошло не так, есть какая-то ошибка в бизнес-процессе.

Gres
Dmitry Shnyrev
А зачем? Какое практическое применение?

А в чем ты думаешь смысл исключений?
Показать, что что-то пошло не так, есть какая-то ошибка в бизнес-процессе.

Ну, да глупый вопрос

[quote="Gres"][quote="Dmitry Shnyrev"]А зачем? Какое практическое применение? [/quote]
А в чем ты думаешь смысл исключений?
Показать, что что-то пошло не так, есть какая-то ошибка в бизнес-процессе.[/quote]
Ну, да :) глупый вопрос :) 

Dmitry Shnyrev
Den Brown
Это нормально?

Это абсолютно ненормально. Я часто такое в чужом коде встречаю. Меня лично это очень расстраивает. try catch имеет другое предназначение, чем проверка наличия записи в базе. К тому же не уверен (не знаю как проверить), но мне кажется что try catch "дорогая" процедура и вот так раскидываться ей по пустякам "дороговато" для кода.

соглашусь полностью. не только потому, что это "дорого", а потому, что считаю моветоном использовать исключения в процессе построения логики.

[quote="Dmitry Shnyrev"][quote="Den Brown"]Это нормально?[/quote]
Это абсолютно ненормально. Я часто такое в чужом коде встречаю. Меня лично это очень расстраивает. try catch имеет другое предназначение, чем проверка наличия записи в базе. К тому же не уверен (не знаю как проверить), но мне кажется что try catch "дорогая" процедура и вот так раскидываться ей по пустякам "дороговато" для кода.[/quote]
соглашусь полностью. не только потому, что это "дорого", а потому, что считаю моветоном использовать исключения в процессе построения логики.