Модераторы: LSD

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Exception vs Error Code, Как вы реализуете Error Management? 
:(
    Опции темы
 
Как вы реализуете Error Management?
Всегда Exception-ы [ 29 ]  [39.19%]
Когда необходимо Error Codes, в остальных случаях Exception-ы [ 32 ]  [43.24%]
Когда необходимо Exception-ы, в остальных случаях Error Codes [ 8 ]  [10.81%]
Всегда Error Codes [ 5 ]  [6.76%]
Всего проголосовавших: 74
В этом опросе возможен один вариант ответа
Гости не могут голосовать 
neutrino
Дата 16.6.2008, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Gothic soul
****


Профиль
Группа: Модератор
Сообщений: 3041
Регистрация: 25.3.2002
Где: Верхняя Галилея, Кармиэль

Репутация: нет
Всего: 62



Привет!

Вот собственно и вопрос. Кто чем пользуется и почему.
Про себя: всегда только Exception-ами. ИМХО нет случая, когда необходимо пользовать Error Code. Если необходимо использовать Error Code, значит ошибка в дизайне.

Или я еще не сталкивался с настоящими случаями в которых нужен Error Code.

PS: Тут не имеются в виду всякие там АПИ. Только ваш код.


--------------------
The truth comes from within ...

Покойся с миром, Vit 
PM MAIL WWW ICQ Skype GTalk   Вверх
maxim1000
Дата 16.6.2008, 22:52 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: нет
Всего: 110



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

естественно, это - не строгое правило, но смысл передаёт

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

теперь рассмотрим объект читающий текстовый файл
так вот его функция чтения строки вполне может возвращать бинарный флаг, информирующий, был ли достигнут конец файла
с одной стороны, попытка чтения строки, когда конец файла достигнут - ошибка
с другой стороны подавляющее большинство файлов когда-нибудь кончаются, так что такая ситуация вполне ожидаема и исключительной её назвать сложно

вариант в голосовании так и не смог выбрать - и то, и то использую

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


--------------------
qqq
PM WWW   Вверх
Lazin
Дата 16.6.2008, 23:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 4
Всего: 154



в основном исключения, завтра напишу подробно  smile 
PM MAIL Skype GTalk   Вверх
chipset
Дата 17.6.2008, 00:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 4
Всего: 164



А если пишешь DLL которая будет юзаться, к примеру дельфой или джавой?


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
neutrino
Дата 17.6.2008, 07:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Gothic soul
****


Профиль
Группа: Модератор
Сообщений: 3041
Регистрация: 25.3.2002
Где: Верхняя Галилея, Кармиэль

Репутация: нет
Всего: 62



Спасибо за ответы.

Вот как мне думается все эти коды возврата делают код менее удобочитаемым. Плюс эксепшены я могу объединять в классы (наследование) ошибок и ловить скажем только ошибки ввода-вывода. Если бы я использовал коды возврата, то пришлось бы перечислять все в ифах. Эксепшены кстати можно ловить все в одной точке. А управление кодами - это еще то занятие... Короче если есть ошибка - это ексепшен. Если нужен код возврата, то это не ошибка а состояние объекта. И нужно сделать дизайн по-другому.
Цитата(maxim1000 @  16.6.2008,  21:52 Найти цитируемый пост)
теперь рассмотрим объект читающий текстовый файл
так вот его функция чтения строки вполне может возвращать бинарный флаг, информирующий, был ли достигнут конец файла

Вот так я никогда не делаю. Вместо этого я пишу отдельный метод, который проверяет достигнут ли конец файла или нет. Одно из главных правил, которым я пользуюсь - одна функция - один таск. Т.е. всегда я обхожу такие ситуации, где нужен код возврата.


--------------------
The truth comes from within ...

Покойся с миром, Vit 
PM MAIL WWW ICQ Skype GTalk   Вверх
chipset
Дата 17.6.2008, 08:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 4
Всего: 164



Цитата(maxim1000 @  16.6.2008,  12:52 Найти цитируемый пост)

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

ИМХО, это усложнит процесс обработки ошибок. Усложнять процесс обработки ошибок не нужно потому-что баги в ошибко-репортинге где-то хрен знает где на другом полушарии это очень и очень неприятно smile

Добавлено через 40 секунд
Цитата(neutrino @  16.6.2008,  21:41 Найти цитируемый пост)

Вот так я никогда не делаю. Вместо этого я пишу отдельный метод, который проверяет достигнут ли конец файла или нет. Одно из главных правил, которым я пользуюсь - одна функция - один таск. Т.е. всегда я обхожу такие ситуации, где нужен код возврата. 

Так построено большинство библиотек, тот-же STL smile


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
Lazin
Дата 17.6.2008, 08:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 4
Всего: 154



попробую разложить по полочкам:
  • исключения очень сильно упрощают код
  • исключения делают код надежнее
  • исключения документируют код
1. исключения очень сильно упрощают код, так как позволяют разделить алгоритм нормального выполнения программы и алгоритм аварийной работы. Код получается более прозрачный, и компактный. Самое главное подсистема обработки ошибок не влияет на семантику класса.
Пример:
Код

HRESULT f1()
{
    HRESULT hr = f2();
    if ( FAILED(hr) )
    {
        return hr;
    }
    hr = f3();
    if ( FAILED(hr) )
    {
        return hr;
    }
    hr = f4();
    if ( FAILED(hr) )
    {
        return hr;
    }    
}
...
HRESULT hr = f1();
if ( FAILED(hr)
{
    //handle error
}

не очень ясный код, неправда-ли? smile 
Код

void f1()
{
    f2();
    f3();
    f4();
}
...
try
{
    f1();
}
catch( std::exception& e)
{
    //handle error
}

уже намного понятнее.. самое главное, в функции f1 вообще нет логики для обработки ошибок smile 
2. исключения делают код надежнее, в первую очередь из-за того, что исключение нельзя не обработать, как в случае с кодом ошибки, который можно легко потерять. В случае исключения проще найти причину ошибки.. так как исключение как правило несет в себе больше информации.
3. здесь все просто. 
Код

HRESULT func()
{
    ...
    if (...)
        return E_FAIL;
}

код возврата говорит только о том, что произошла какая-то ошибка и все
Код

void func()
{
    ...
    if (...)
        throw std::runtime_error("func: причина возникновения ошибки");
}

здесь, мало того, что исключение содержит диагностическую информацию, оно еще и документирует код... smile 

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

int func(int key)
{
    ...
    std::map<int, int>::iterator i = data.find(key);
    //допустим data содержит положительные элементы
    if (i == data.end())//нет такого ключа
        return -1;
    return i->second;
}


Код

int func(int key)
{
    ...
    std::map<int, int>::iterator i = data.find(key); 
    if (i == data.end())//нет такого ключа
        throw std::runtime_error("func: нет значения в контейнере!");
    return i->second;
}

что из этого лучше трудно сказать, это зависит от контекста использования... например если отсутствие ключа в контейнере обычное явление, то наверное лучше первый вариант, а если отсутствие ключа означает сбой в работе программы, то второй...
PM MAIL Skype GTalk   Вверх
neutrino
Дата 17.6.2008, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Gothic soul
****


Профиль
Группа: Модератор
Сообщений: 3041
Регистрация: 25.3.2002
Где: Верхняя Галилея, Кармиэль

Репутация: нет
Всего: 62



Lazin, спасибо за пост.

Цитата(Lazin @  17.6.2008,  07:36 Найти цитируемый пост)
что из этого лучше трудно сказать, это зависит от контекста использования... например если отсутствие ключа в контейнере обычное явление, то наверное лучше первый вариант, а если отсутствие ключа означает сбой в работе программы, то второй... 

Вот как раз об этом и речь. 


--------------------
The truth comes from within ...

Покойся с миром, Vit 
PM MAIL WWW ICQ Skype GTalk   Вверх
Nastya
Дата 17.6.2008, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 27.3.2002
Где: Мариуполь

Репутация: нет
Всего: 44



п.2.
Error Code, если :
1. не всегда exception -ы возможны, помнится на PowerTV OS их юзать было нельзя :( 
2. Если изначально написание идет в си- стиле (не с++)
3. Интерфейсы типа idl и т.д.

может когда еще.
а так  exception


--------------------
Что бы понять рекурсию, надо понять рекурсию

"Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор
PM MAIL   Вверх
neutrino
Дата 17.6.2008, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Gothic soul
****


Профиль
Группа: Модератор
Сообщений: 3041
Регистрация: 25.3.2002
Где: Верхняя Галилея, Кармиэль

Репутация: нет
Всего: 62



Интересно отметить, что ни в одном фундаментальном фреймворке вообще нет кодов возврата. Например в .NET-е или в Java.


--------------------
The truth comes from within ...

Покойся с миром, Vit 
PM MAIL WWW ICQ Skype GTalk   Вверх
neutrino
Дата 17.6.2008, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Gothic soul
****


Профиль
Группа: Модератор
Сообщений: 3041
Регистрация: 25.3.2002
Где: Верхняя Галилея, Кармиэль

Репутация: нет
Всего: 62



Интересно отметить, что ни в одном фундаментальном фреймворке вообще нет кодов возврата. Например в .NET-е или в Java.


--------------------
The truth comes from within ...

Покойся с миром, Vit 
PM MAIL WWW ICQ Skype GTalk   Вверх
neutrino
Дата 17.6.2008, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Gothic soul
****


Профиль
Группа: Модератор
Сообщений: 3041
Регистрация: 25.3.2002
Где: Верхняя Галилея, Кармиэль

Репутация: нет
Всего: 62



Интересно отметить, что ни в одном фундаментальном фреймворке вообще нет кодов возврата. Например в .NET-е или в Java.


--------------------
The truth comes from within ...

Покойся с миром, Vit 
PM MAIL WWW ICQ Skype GTalk   Вверх
LSD
Дата 17.6.2008, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 9
Всего: 538



Цитата(neutrino @  17.6.2008,  13:53 Найти цитируемый пост)
Интересно отметить, что ни в одном фундаментальном фреймворке вообще нет кодов возврата. Например в .NET-е или в Java.

В Java - есть, но мало. Например функция удаления файла возвращает булево значение и выкидывает ексепшн. Или чтение из потока, тоже использует и коды возврата и ексепшены.

Хороший пример использования кодов: это библиотека HttpClient. Метод execute() возвращает код возврата связанный с ошибками HTTP протокола и выкидывает ексепшн когда происходят ошибки сети или парсинга HTTP-ответа.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
skyboy
Дата 17.6.2008, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 1
Всего: 260



Цитата(neutrino @  17.6.2008,  11:53 Найти цитируемый пост)
 ни в одном фундаментальном фреймворке вообще нет кодов возврата. Например в .NET-е или в Java.

т.е. поиск позиции подстроки в строке выбрасывает Exception? smile

Добавлено через 1 минуту и 10 секунд
имел в виду ситуацию, когда подстрока в строке отсутствует
PM MAIL   Вверх
neutrino
Дата 17.6.2008, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Gothic soul
****


Профиль
Группа: Модератор
Сообщений: 3041
Регистрация: 25.3.2002
Где: Верхняя Галилея, Кармиэль

Репутация: нет
Всего: 62



LSD
skyboy
Да вы правы.

Каким же правилом руководствоваться и в каких ситуациях?


--------------------
The truth comes from within ...

Покойся с миром, Vit 
PM MAIL WWW ICQ Skype GTalk   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила ведения Религиозных войн
Smartov
1. Уважайте собеседника
2. Собеседник != враг
3. Старайтесь воздерживаться от тем вида "Windows Rulez" или "Linux Rulez"

С уважением, Smartov.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Религиозные войны | Следующая тема »


 




[ Время генерации скрипта: 0.1063 ]   [ Использовано запросов: 23 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.