powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Исключения: за и против
25 сообщений из 158, страница 4 из 7
Исключения: за и против
    #34372637
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вяло что-то, вяло обсуждаем... Надо подлить маслица в огонь: А вот что делать, ежели ошибка произошла в одном потоке, а обработать ее надо в другом.
...
Рейтинг: 0 / 0
Исключения: за и против
    #34372646
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
onstat- White Owl
Ну если это правильно и клево, покажи мне реальную задачу решеную через исключения и чтоб это решение было удобнее чем решение через коды возврата. Вот man_555 очень любит исключения, но показать такую реальную задачу не смог. Может ты сможешь?
Как вариант:
Выход из тупиков и бесконечных циклов при обработке графов.Не годится. После натыкания на тупик надо обязательно проверить братские проходы. А значит каждый раз при шаге назад надо будет проверять был ли там тупик. А это можно с легкостью делать и на кодах возврата.
...
Рейтинг: 0 / 0
Исключения: за и против
    #34372666
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl пишет:
> Ну если это правильно и клево, покажи мне реальную задачу решеную через
> исключения и чтоб это решение было удобнее чем решение через коды
> возврата. Вот man_555 очень любит исключения, но показать такую реальную
> задачу не смог. Может ты сможешь?

CTResults &rs = query.getResults();

for(size_t i =0; i < rs[0].NRows(); ++i) {
const CTRow &row = rs[0] ;

// Здесь чисто теоретически могут возникать exceptopns
// если в наборе данных нет полей с названиями "name", "age" или "gender".
// Но в отлаженном коде такого быть не может. А если такое случается,
// надо вылететь на фиг и ничего не делать.

std::cout << "Name:" << row["name"] << " "
<< "Age: " << row["age"] << " "
<< "Gender:" << row["gender"] << std::endl;
}



> Бррр.. Ну что значит "не писать код обработки ошибок"? Ты в любом случае
> будешь писать код обработки ошибки или код обработки исключения. В чем
> разница то?

Я БУДУ ПИСАТЬ ЕГО ОДИН РАЗ !! А не в каждой функции в стеке вызовов.
В этом разница.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Исключения: за и против
    #34372675
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blindedВяло что-то, вяло обсуждаем... Надо подлить маслица в огонь: А вот что делать, ежели ошибка произошла в одном потоке, а обработать ее надо в другом.

У каждой инти свой стек, она его и будет раскручивать.

ИМХО
А обработчик исключений рапотовать другой нити стандартными средствами синхронизации.
Если уж срочно нужно, то конструктор класса исключений тоже по идее может.

Очень интересная тема , кстате.
...
Рейтинг: 0 / 0
Исключения: за и против
    #34372684
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl onstat- White Owl
Ну если это правильно и клево, покажи мне реальную задачу решеную через исключения и чтоб это решение было удобнее чем решение через коды возврата. Вот man_555 очень любит исключения, но показать такую реальную задачу не смог. Может ты сможешь?
Как вариант:
Выход из тупиков и бесконечных циклов при обработке графов.Не годится. После натыкания на тупик надо обязательно проверить братские проходы. А значит каждый раз при шаге назад надо будет проверять был ли там тупик. А это можно с легкостью делать и на кодах возврата.

Я знал, что Вы так ответите.
С таки же успехом вы будете проходить теже пути и без исключений.
Я не говорил, что исключения заменяют карту проходов.
...
Рейтинг: 0 / 0
Исключения: за и против
    #34372740
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
onstat- blindedВяло что-то, вяло обсуждаем... Надо подлить маслица в огонь: А вот что делать, ежели ошибка произошла в одном потоке, а обработать ее надо в другом.

У каждой инти свой стек, она его и будет раскручивать.

ИМХО
А обработчик исключений рапотовать другой нити стандартными средствами синхронизации.
Если уж срочно нужно, то конструктор класса исключений тоже по идее может.

Очень интересная тема , кстате.
Ну так потому и затронул :)
А что касается исключений, то тут двух мнений быть не может. С исключениями жизнь проще и веселее, чем без них. Хотя бы потому что исключение может нести в себе гораздо больше информации об ошибке, нежели просто код возврата. Контекст в котором произошла ошибка - вот чего зачастую не хватало при обработки ошибки. Если вспомнить былые времена, то сколько сил уходило на написание всяческих отладочных вызовов с записью в системные логи или самописные debug файлы, причем этими вызовами была пронизана вся программаю
А что касается обработки ошибок в другом потоке, то посмотрите на паттерн Капсула, я 2 второй странице ссылочку писал. Ну что твои исключения.
...
Рейтинг: 0 / 0
Исключения: за и против
    #34372770
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivCTResults &rs = query.getResults();

for(size_t i =0; i < rs[0].NRows(); ++i) {
const CTRow &row = rs[0] ;

// Здесь чисто теоретически могут возникать exceptopns
// если в наборе данных нет полей с названиями "name", "age" или "gender".
// Но в отлаженном коде такого быть не может. А если такое случается,
// надо вылететь на фиг и ничего не делать.

std::cout << "Name:" << row["name"] << " "
<< "Age: " << row["age"] << " "
<< "Gender:" << row["gender"] << std::endl;
}
Поясни пожалуйста, что значит "вылететь на фиг и ничего не делать"? Для вылета нафиг вообще никакая обработка ошибок не нужна :)


MasterZiv> Бррр.. Ну что значит "не писать код обработки ошибок"? Ты в любом случае
> будешь писать код обработки ошибки или код обработки исключения. В чем
> разница то?
Я БУДУ ПИСАТЬ ЕГО ОДИН РАЗ !! А не в каждой функции в стеке вызовов.
В этом разница.Еще раз "бррр". А почему ты решил что я буду что-то там писать в каждой функции??? Вон в приведеном примере, когда я определяю оператор [] для резалтсета, я предпочту не бросать исключение, а возвращать указатель на пустую строку. Тогда, даже если злодей пойдет и переименует поле gender в поле sex - я все равно получу список name-age с пустотой вместо gender. А в твоем варианте обращение к row["gender"] вызовет полный аборт всей процедуры и ты не получишь вообще ничего. А я хотя бы часть данных увижу.
...
Рейтинг: 0 / 0
Исключения: за и против
    #34372783
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
onstat-С таки же успехом вы будете проходить теже пути и без исключений.
Я не говорил, что исключения заменяют карту проходов.Конечно это можно сделать и через исключения и без них. Но спор то идет: "Исключения: за и против"

blindedС исключениями жизнь проще и веселее, чем без них. Хотя бы потому что исключение может нести в себе гораздо больше информации об ошибке, нежели просто код возврата. Контекст в котором произошла ошибка - вот чего зачастую не хватало при обработки ошибки. Если вспомнить былые времена, то сколько сил уходило на написание всяческих отладочных вызовов с записью в системные логи или самописные debug файлы, причем этими вызовами была пронизана вся программаюЭто очень убедительное утверждение, до тех пор пока не задумаешься, а кто именно и где заполняет исключение этим самым контекстом.
...
Рейтинг: 0 / 0
Исключения: за и против
    #34372804
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl Вон в приведеном примере, когда я определяю оператор [] для резалтсета, я предпочту не бросать исключение, а возвращать указатель на пустую строку. Тогда, даже если злодей пойдет и переименует поле gender в поле sex - я все равно получу список name-age с пустотой вместо gender. А в твоем варианте обращение к row["gender"] вызовет полный аборт всей процедуры и ты не получишь вообще ничего. А я хотя бы часть данных увижу.
Если бы строители строили здания, как программисты пишут программы....

С таким подходом нужно писать на Basic, не забывая в каждой процедуре написать
Код: plaintext
on error resume next 
...
Рейтинг: 0 / 0
Исключения: за и против
    #34372817
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blinded пишет:
> делать, ежели ошибка произошла в одном потоке, а обработать ее надо в
> другом.

Использовать IPC. Ни стандартные методы обработки, ни exceptions здесь ни
при чем.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Исключения: за и против
    #34372836
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl пишет:

> Поясни пожалуйста, что значит "вылететь на фиг и ничего не делать"? Для
> вылета нафиг вообще никакая обработка ошибок не нужна :)

Пример раз :
Программа - консольное приложение, которое должно сформировать и отправить
электронное письмо. Если что-то не так, например, одно из полей отсутствует,
приложение должно завершиться с ошибкой. Бросается исключение, оно ловится
в main, выводится сообщение об ошибке, завершается приложение.

Пример два.
Программа - GUI -приложение, форма для редактирования данных.
На форме есть кнопка "Расчитать", при нажатии на нее производится
определенное вычисление. Если что-то не так - нет полей - вычисление
производить невозможно. Значение, получаемое в ходе вычисления,
неопределено. Исключение ловится во фрейме, обрамляющем обработку
сообщения, обрабатывается соотв. образом (выводится сообщ. об ошибке)
и программа не выполняет действия "Расчет". Приложение при этом
может продолжать работать дальше в части, не касающейся этого,
а после устранения проблемы - может работать нормально и здесь.


А почему ты решил что я буду что-то там писать в каждой
> функции??? Вон в приведеном примере, когда я определяю оператор [] для
> резалтсета, я предпочту не бросать исключение, а возвращать указатель на
> пустую строку.

1) Там возвращается не указатель, а ссылка.
2) Возврат специального значения в случае ошибки - плохой
подход.
3) Тобой описывается другая семантика работы функции.
И такая, и такая функция могут существовать, причем вместе.
Для одной исключения не нужны, для другой - нужны.

Тогда, даже если злодей пойдет и переименует поле gender
> в поле sex - я все равно получу список name-age с пустотой вместо
> gender. А в твоем варианте обращение к row["gender"] вызовет полный
> аборт всей процедуры и ты не получишь вообще ничего. А я хотя бы часть
> данных увижу.

И ты думаешь, что это хорошо? Я вообще не знаю, что такое "часть данных".
Вот например, есть у тебя банковский атрибут. Но без БИК. Это все
равно что его бы и не было вообще. Так что либо все, либо ничего.

В общем, все, к чему ты призываешь - неправильно, нельзя так писать программы.
Если ошибка есть, ее нельзя частично игнорировать. Бывают конечно
исключения, но ...
В общем-то не нравятся тебе исключения - ради бога, не используй.
Твои программы, тебе их потом поддерживать.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Исключения: за и против
    #34373703
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl

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


Заполняется при throw.

Уже не помню откуда этот очень полезный и показательный пример с SQL.RU || RSDN
(Автор не я, копирайт утерян):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
#include <cstdio>
#include <stdexcept>

struct throw_site
{
     throw_site(char const* file, int line)
         : file_(file), line_(line)
     {}

     char const* file_;
     int line_;
};

template<class exception>
struct wrapper : exception, throw_site
{
     wrapper(exception const& e, throw_site const& s)
         : exception(e), throw_site(s)
     {}
};

template<class exception>
void operator+(throw_site const& s, exception const& e)
{
     throw wrapper<exception>(e, s);
}

#define throw throw_site(__FILE__, __LINE__) +

int main()
{
     try
     {
         throw std::runtime_error("oops");
     }
     catch(std::exception& e)
     {
         if(throw_site* s = dynamic_cast<throw_site*>(&e))
         {
             fprintf(stderr, "thrown at %s:%d\n", s->file_, s->line_);
         }
     }
}



В месте перехвата вы получаете строку и файл, где оно было возбуждено.
Можете отнаследоваться и в конструктор в качестве параметра передать
другую дополнительную информацию.
Которую потом обработаете в месте перехвата.
...
Рейтинг: 0 / 0
Исключения: за и против
    #34375685
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivПример раз :
Программа - консольное приложение, которое должно сформировать и отправить
электронное письмо. Если что-то не так, например, одно из полей отсутствует,
приложение должно завершиться с ошибкой. Бросается исключение, оно ловится
в main, выводится сообщение об ошибке, завершается приложение.Точно так же, только вместо throw используем return. Решение ничем кроме синтаксиса не отличается.

MasterZivПример два.
Программа - GUI -приложение, форма для редактирования данных. На форме есть кнопка "Расчитать", при нажатии на нее производится определенное вычисление. Если что-то не так - нет полей - вычисление производить невозможно. Значение, получаемое в ходе вычисления, неопределено. Исключение ловится во фрейме, обрамляющем обработку сообщения, обрабатывается соотв. образом (выводится сообщ. об ошибке) и программа не выполняет действия "Расчет". Приложение при этом может продолжать работать дальше в части, не касающейся этого, а после устранения проблемы - может работать нормально и здесь.Опять таки, функция расчета может делать throw, может делать return errormessage. Разница чисто синтаксическая.


MasterZiv1) Там возвращается не указатель, а ссылка.
2) Возврат специального значения в случае ошибки - плохой подход.
3) Тобой описывается другая семантика работы функции.
И такая, и такая функция могут существовать, причем вместе.
Для одной исключения не нужны, для другой - нужны.1) в данном случае это не важно
2) Почему плохой? Да, это не всегда возможно, но в большинстве случаев вполне возможно и запросто.
3) Конечно другая, мы ж о том и говорим какой из подходов удобнее :) Но вот если одновременно существуют два варианта функции: возвращающая код ошибки или бросающая исключение - вот это уже будет плохо. Запутаться будет легко.


MasterZivИ ты думаешь, что это хорошо? Я вообще не знаю, что такое "часть данных".
Вот например, есть у тебя банковский атрибут. Но без БИК. Это все
равно что его бы и не было вообще. Так что либо все, либо ничего.Да, я думаю что это хорошо. Если я знаю что без БИК запись быть не может - я во первых запрещу такие записи хранить в БД :) А во вторых, если по каким-то причинам я не могу поправить структуру БД, я могу уже на клиенте делать специальную проверку на заполненность поля "БИК" и обламывать вывод с соответствующей диагностикой.
А если речь идет о вспомогательной таблице, ну хотя бы - контактное лицо для этого банковского аттрибута - там поле gender вполне может быть а может и не быть. Но обламывать показ список всех клиентов только из-за того что какому-то из главбухов забыли указать пол? Или как я уже предполагал поле пола переименовали. Есть информация важная, есть второстепенная. Важную - ты всегда будешь специально проверять (и не по одному разу) а второстепенную можно отдать на откуп общему обработчику ошибок. Выдача пустого результата здесь на мой взгляд более подходит чем глобальный облом.


MasterZivВ общем, все, к чему ты призываешь - неправильно, нельзя так писать программы. Если ошибка есть, ее нельзя частично игнорировать. Бывают конечно исключения, но ...
В общем-то не нравятся тебе исключения - ради бога, не используй. Твои программы, тебе их потом поддерживать. Ну почемуж неправильно? Оглянись вокруг - сколько программ написано на языках не имеющих механизма исключений вообще. И ведь работают! И поддерживаются эти программы. Или вы на таких языках в принципе не пишите? :)
...
Рейтинг: 0 / 0
Исключения: за и против
    #34375734
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не всетаки есть места где гораздо удобнее с исключениямию
Ну ведь согласись
template< typename T>
class Stack
{
public:
...
void push(const T&); //Ну ведь гораздо симпатичнее получит exception чем возвращать int
void pop();
...
const T& read(); // Ну а ежели здесь вернут ссылку на NULL объект для пустого стека, ну совсем фи
};

----
Если молния в лоб угодит,
Значит просто подставлен лоб
...
Рейтинг: 0 / 0
Исключения: за и против
    #34375747
roman10
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlТочно так же, только вместо throw используем return. Решение ничем кроме синтаксиса не отличается.
Так и есть. Одна из основных целей задействования механизма исключений и состоит в том, чтобы уменьшить количество писанины.

Сравните, к примеру, код работы с неким COM-объектом:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
// С проверкой кода вовзрата
HRESULT hRes;

if (FAILED(hRes = pObj->DoSomething())))
    return hRes;

if (FAILED(hRes = pObj->DoAnotherThing())))
    return hRes;

if (FAILED(hRes = pObj->DoAnotherThingOneMoreTime())))
    return hRes;

// ...
// и так сто раз

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
// С исключениями
// Для этого вокруг всех методов пишем обертки вида:

if (FAILED(hRes = pObj->DoSomething())))
    throw hRes;

// Тогда код преобразуется к следующему

pObj->DoSomething();
pObj->DoAnotherThing();
pObj->DoAnotherThingOneMoreTime();

// ...

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


White OwlНу почемуж неправильно? Оглянись вокруг - сколько программ написано на языках не имеющих механизма исключений вообще. И ведь работают! И поддерживаются эти программы. Или вы на таких языках в принципе не пишите? :)
Ну если рассуждать, то можно сказать, что и ассемблер - замечательный язык для решения прикладных задач. Ведь сколько замечательных программ на нем написано! А в нем тоже нет исключений. И контроля типов нет. И автоматического управления памятью тоже нет. Да вообще ничего нет :).
...
Рейтинг: 0 / 0
Исключения: за и против
    #34375795
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blindedНе всетаки есть места где гораздо удобнее с исключениямиюВот в том то и дело, что я не знаю таких мест.

blindedНу ведь согласисьНе соглашусь.
blinded const T& read(); // Ну а ежели здесь вернут ссылку на NULL объект для пустого стека, ну совсем фиПочему же "фи"? Вполне нормально. Во первых, для стека с объектами NULL это очень хороший индикатор "нет объекта", во вторых для стека с числами возвращать ноль из пустого стека это традиция овеяная десятилетиями.
...
Рейтинг: 0 / 0
Исключения: за и против
    #34375805
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
roman10
// С исключениями
// Для этого вокруг всех методов пишем обертки вида:Угу... И писание оберток вокруг всех методов уменьшает количество писанины?
...
Рейтинг: 0 / 0
Исключения: за и против
    #34375816
roman10
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlУгу... И писание оберток вокруг всех методов уменьшает количество писанины?
Да, уменьшает. Обертки пишутся только один раз (а в отношении COM-объектов, вообще генерируются автоматически). Даже в небольших проектах, объем кода, приходящийся на обертки, будет существенно меньше объема постоянных проверок кодов возврата.
...
Рейтинг: 0 / 0
Исключения: за и против
    #34375834
White Owl blindedНе всетаки есть места где гораздо удобнее с исключениямиюВот в том то и дело, что я не знаю таких мест.


б.м. неудача при попытке захвата ресурса в конструкторе как раз тот случай?
...
Рейтинг: 0 / 0
Исключения: за и против
    #34375918
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl blindedНе всетаки есть места где гораздо удобнее с исключениямиюВот в том то и дело, что я не знаю таких мест.

blindedНу ведь согласисьНе соглашусь.
blinded const T& read(); // Ну а ежели здесь вернут ссылку на NULL объект для пустого стека, ну совсем фиПочему же "фи"? Вполне нормально. Во первых, для стека с объектами NULL это очень хороший индикатор "нет объекта", во вторых для стека с числами возвращать ноль из пустого стека это традиция овеяная десятилетиями.

Обратите внимание это НЕ указатель , а ссылка .

проверять как?


Код: plaintext
1.
2.
3.
const T object;
object.somemethod(); // тут прогамма упадет

...
Рейтинг: 0 / 0
Исключения: за и против
    #34375920
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl blindedНе всетаки есть места где гораздо удобнее с исключениямиюВот в том то и дело, что я не знаю таких мест.

Я тоже так думал, пока не начал писать с ними.

White Owl
blindedНу ведь согласисьНе соглашусь.

Я не навязываюсь

White Owl blinded const T& read(); // Ну а ежели здесь вернут ссылку на NULL объект для пустого стека, ну совсем фиПочему же "фи"? Вполне нормально. Во первых, для стека с объектами NULL это очень хороший индикатор "нет объекта", во вторых для стека с числами возвращать ноль из пустого стека это традиция овеяная десятилетиями.
Один маленький недостаток для каждого типа T свое понятие о NULL объекте для int 0, а для какого-нибудь employee?
Вот и не получится никакого обобщенного типа стека:(
Нет, конено можно написать и так
template <typename T>
class Stack
{
public:
...
int size() const;
const T& read() const { assert(size()); return ...; }
};

Жить можно, все равно при отладке вылезет
...
Рейтинг: 0 / 0
Исключения: за и против
    #34376154
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl пишет:

> Точно так же, только вместо throw используем return. Решение ничем кроме
> синтаксиса не отличается.

Ну ты стойкий перец! Упорно меня не хочешь понимать.
Решения ОТЛИЧАЮТСЯ тем, что при RETURN тебе надо будет
написать обработку ошибок НА ВСЕХ ПРОМЕЖУТОЧНЫХ УРОВНЯХ
в стеке вызовов, приведших к вызову данной функции.
Для того и созданы exceptions чтобы с этим бороться.
Если бы была разница только в синтаксисе, никому было бы
это не нужно.

Но я не буду тебя далее убеждать ввиду твоей особой "стойкости"
в твоих заблуждениях.

> 2) Возврат специального значения в случае ошибки - плохой подход.
> 2) Почему плохой? Да, это не всегда возможно, но в большинстве случаев
> вполне возможно и запросто.

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

> 3) Тобой описывается другая семантика работы функции.
> И такая, и такая функция могут существовать, причем вместе.
> Для одной исключения не нужны, для другой - нужны.
> 3) Конечно другая, мы ж о том и говорим какой из подходов удобнее :) Но
> вот если одновременно существуют два варианта функции: возвращающая код
> ошибки или бросающая исключение - вот это уже будет плохо. Запутаться
> будет легко.

Ничего плохого. Одна другую дополняет. Что для одной - исключительная
ситуация, для другой - нормальное поведение.


> может и не быть. Но обламывать показ список всех клиентов только из-за
> того что какому-то из главбухов забыли указать пол?

Я не говорил про "забыли указать пол". Там вообще ПОЛЯ ТАКОГО НЕТ.

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

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


> Ну почемуж неправильно? Оглянись вокруг - сколько программ написано на
> языках не имеющих механизма исключений вообще. И ведь работают! И
> поддерживаются эти программы. Или вы на таких языках в принципе не

О! Это- свежая струя в споре. Давай попробуем перечислить языки
и понять, в каких есть исключения, в каких нет. Если тех, где
нет окажется больше, значит исключения не так уж и важны.
(скриптовые языки не берем)

я начинаю, языки в которых есть exceptions:

С++
Java
(common) Lisp
Python
Delphi
....

Теперь твой ход.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Исключения: за и против
    #34376157
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl пишет:

> возвращать ноль из пустого стека это традиция овеяная десятилетиями.

В за... нафиг такие традиции.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Исключения: за и против
    #34376185
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Касательно исключений и COM. Как можно вот такое реализовать без исключений и goto ?
Код древний и не самый качественный/удачно написанный, сейчас пишу другим стилем и т.д. НО такая задача все равно будет решаться похожим образом:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
//макрос HRCHECK бросает самодельный класс исключения, в случае если FAILED(hr) == true;
//В классе содержится информация о номере строки, имени функции и т.д...
#define HRCHECK(hr) (FAILED(hr)? throw CGameLevelException(TEXT(__FILE__), __LINE__, TEXT(__FUNCTION__), hr, TEXT("N/A")):  0 );


void LoadLevelFromX(LPCSTR lpszXFile){
	char szbuf[ 128 ];
	char szbuf2[ 128 ];
	ExtractFileName(szbuf2, lpszXFile);
	sprintf(szbuf, "%s%d", szbuf2, rand());//GetTickCount());
	LPDIRECTXFILEENUMOBJECT lpDXFileEnum =  0 ;
	LPDIRECTXFILEDATA lpDXFileData =  0 ;
	LPDIRECTXFILE lpDXFileApi =  0 ;
	HRESULT hr;
	try{
		hr = DirectXFileCreate(&lpDXFileApi);
		HRCHECK(hr,"DirectXFileCreate() failed!", CGameLevelException);
		hr = lpDXFileApi->RegisterTemplates((LPVOID)D3DRM_XTEMPLATES, D3DRM_XTEMPLATE_BYTES);
		HRCHECK(hr,"lpDXFileApi->RegisterTemplates failed!", CGameLevelException);
		hr = lpDXFileApi->CreateEnumObject((LPVOID)lpszXFile, DXFILELOAD_FROMFILE, &lpDXFileEnum);
		HRCHECK(hr,"lpDXFileApi->CreateEnumObject failed!", CGameLevelException);
		hr = lpDXFileEnum->GetNextDataObject(&lpDXFileData);
		while (SUCCEEDED(hr)){
			//ProcessTemplate(lpDXFileData);
			//waiting until TID_D3DRM_FRAME arrives-----------------------
			const GUID* lpType;
			hr = lpDXFileData->GetType(&lpType);
			//hr=E_FAIL;
			HRCHECK(hr, "lpDXFileData->GetType() failed!", CGameLevelException);
			if(*lpType==TID_D3DRMFrame){
					_D("TID_D3DRMFrame found!\n");
					DWORD dwNameSize;
					hr = lpDXFileData->GetName( 0 , &dwNameSize);
					HRCHECK(hr, "GetNameSize failed", CGameLevelException);
					char buf[ 128 ];
					hr = lpDXFileData->GetName(buf, &dwNameSize);
					HRCHECK(hr, "GetName failed", CGameLevelException);
					if (dwNameSize)
						if (_stricmp(buf, "Scene_root")== 0 ){
							_D("SceneRoot found\n");
							GameLevel_LoadLevel_RootLoop(lpDXFileData);
						}
				}
			else
				_D ("Not TID_D3DRMFRAME\n");
			//---------------------------------------------------------------------------------
			SAFE_RELEASE(lpDXFileData);
			hr = lpDXFileEnum->GetNextDataObject(&lpDXFileData);	
		}
		SAFE_RELEASE(lpDXFileEnum);
		SAFE_RELEASE(lpDXFileData);
		SAFE_RELEASE(lpDXFileApi);
	}
	catch(...){
		SAFE_RELEASE(lpDXFileEnum);
		SAFE_RELEASE(lpDXFileData);
		SAFE_RELEASE(lpDXFileApi);
		throw;
	}
}
При каждом случае, когда хоть одна процедура возвращает код неудачи, дальнейшее выполнение функции невозможно. ОДнако все равно надо будет освободить созданные интерфейсы и т.д.
...
Рейтинг: 0 / 0
Исключения: за и против
    #34376292
daevaorn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ErV ОДнако все равно надо будет освободить созданные интерфейсы и т.д.а если применить RAII? Тогда проблемы в ручном освобождениии не будет
...
Рейтинг: 0 / 0
25 сообщений из 158, страница 4 из 7
Форумы / C++ [игнор отключен] [закрыт для гостей] / Исключения: за и против
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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