Re[24]: Checked exceptions... зло или добро?
От: VladD2 Российская Империя www.nemerle.org
Дата: 22.07.05 21:21
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>В этих традициях написана VM того же .Net: посмотри, как там с помощью _ASSERTE проверяются предусловия и постусловия. В случае их нарушения никаких исключений не будет. Все просто "тихо" упадет.


_ASSERTE работает только в дебаге. И даже в нем от него ничего не упадет. А вот AV после словить можно. Думаю, выбор _ASSERTE здесь был обусловлен тем, что это все же код ядра и напрямую его никто вызывать не будет (а значит его можно как следует отестировать), ну, и требованиями производительности. Все же все эти проверки потребляют время, а в ядре рантайма это может оказаться критическим. Однако, если ты посмотришь мнее предвзято, то заметиль, что код ядра генерирует не мало исключений.

ПК> При этом проверки в критических местах уже присутствуют. Вопрос: почему их в release версии не превращают в исключения? Ответ на этот вопрос поможет понять позицию, которую я в этой теме озвучивал.


Не поможет. Так как в релизе они с вероятностью в 99% превратятся в AV со всеми вытекающими.

ПК>Тестирование миллионами пользователей здесь вообще ни при чем, т.к. ошибки из разряда "вылетов" виртуальной машины пользователи рапортовать просто не должны.


Должен, не должен. А оно есть. Как факт. И ничего ты с этим не поделашь.

ПК> Их нужно отлавливать "до того", на этапе разработки и внутреннего тестирования. То же самое верно и для прикладных приложений.


Желательно отлавливать до. Но никто от ошибок не застрахован. И ассерт может быть не верным, в конц концов.

ПК>Бывают исключительные ситуации, которые программа и должна обрабатывать: нехватка ресурсов


А она отчего появилась?

ПК> какие-то нарушения в окружении,


А они откуда?

ПК> неверные данные


Как не верные? Значит опять ошибка програмиста?

ПК>и т.п. К ошибкам программирования это все не относится.


Очень странное мнние.
... << RSDN@Home 1.2.0 alpha rev. 578>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[16]: Checked exceptions... зло или добро?
От: Cyberax Марс  
Дата: 22.07.05 21:31
Оценка:
VladD2 wrote:

>>> Программист скажет. Ну, вылетит программка при тестировани...

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

Мне вот так не кажется. Проверяемые исключения рассматриваются как часть
сигнатуры функции — то есть как часть ее типа. Точно так же, как и
статическая типизация, проверяемые исключения позволяют находить ошибки
во время компиляции.

--
С уважением,
Alex Besogonov (alexy@izh.com)
Posted via RSDN NNTP Server 1.9
Sapienti sat!
Re[25]: Checked exceptions... зло или добро?
От: VladD2 Российская Империя www.nemerle.org
Дата: 22.07.05 22:11
Оценка: :))
Здравствуйте, Cyberax, Вы писали:

C>А какой вариант лучше? Сразу определить нужный метод загрузки — нельзя.

C>Предварительно обходить граф, чтобы проверить возможность быстрой
C>загрузки — неэффективно. Без исключений пришлось бы возвращать код
C>ошибки через несколько уровней вложенности.

C>Быстрый метод использует закэшированные локально преобразования (в виде

C>слинкованого бинарного изображения из собственного JIT-компилятора).
C>Если встречается неизвестное преобразование — включается второй режим,
C>когда преобразования врубаются в интерпретируемый режим с параллельной
C>перекомпиляцией.

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

C>И не надо предлагать мне использовать .NET и не мучаться с ручным JIT-ом...


Я даже подумать не успел, а ты уже хорошее решение придумал.
... << RSDN@Home 1.2.0 alpha rev. 578>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[23]: Checked exceptions... зло или добро?
От: VladD2 Российская Империя www.nemerle.org
Дата: 22.07.05 22:11
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>С завидной переодичностью получаю OutOfMemory — несколько раз в неделю,


Видимо когда мы бэкапы делаем.

C>иногда не дает с постить с ошибкой о недостаточности прав и т.п.


А это скорее всего тему удалили. При этом она переносится в форум Мусор в который писать никто не может.
... << RSDN@Home 1.2.0 alpha rev. 578>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[24]: Checked exceptions... зло или добро?
От: VladD2 Российская Империя www.nemerle.org
Дата: 22.07.05 22:11
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>В C++ я предпочитаю такой вариант:

ПК>
ПК>boost::optional< Person >
ПК>findPersonByName( std::string name );
ПК>

ПК>или, для C#:
ПК>
ПК>Person?
ПК>findPersonByName( string name );
ПК>

ПК>или (вот здесь я уже не вполне уверен, можно ли на Java так сделать --
ПК>если нет, тем хуже для Java ):
ПК>
ПК>Optional<Person>
ПК>findPersonByName( String name );
ПК>

ПК>И не нужно никаких лишних комментариев и, тем более, исключений.

Кстати, в C# с большой вероятностью, а в Яве так на 100% Person будет ссылочным типом, так что даже Person? и т.п. не потребуется. Можно просто возвращать null если человека нет.
... << RSDN@Home 1.2.0 alpha rev. 578>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[25]: Checked exceptions... зло или добро?
От: VladD2 Российская Империя www.nemerle.org
Дата: 22.07.05 22:11
Оценка: +5
Здравствуйте, dshe, Вы писали:

D>Приведу еще один небольшой аргумент в пользу исключений. Исключения могут с собой нести некоторую дополнительную информацию. Например, PersonNotFoundException мог бы содержать имена существующих людей, которые наиболее близки к искомому. Эту информацию можно было бы использовать для того, чтобы помочь пользователю в его поиске. Признаюсь, я очень редко пользовался этой возможностью и еще реже видел, чтобы класс исключения (написанный не мной) содержал в себе что-то более чем error message.


Ужасный аргумент. В таких случаях лучше сделать отдельную функцию которая возвратит результат запакованным в объект хранящий эту дополнительную информацию. А использовать в таких случаях исключения как раз самое неверное решение.
... << RSDN@Home 1.2.0 alpha rev. 578>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[25]: Checked exceptions... зло или добро?
От: Павел Кузнецов  
Дата: 22.07.05 22:38
Оценка: 1 (1) +1
VladD2,

> ПК>В C++ я предпочитаю такой вариант:

> ПК>
> ПК>boost::optional< Person >
> ПК>findPersonByName( std::string name );
> ПК>

> ПК>или, для C#:
> ПК>
> ПК>Person?
> ПК>findPersonByName( string name );
> ПК>

> ПК>или (вот здесь я уже не вполне уверен, можно ли на Java так сделать --
> ПК>если нет, тем хуже для Java ):
> ПК>
> ПК>Optional<Person>
> ПК>findPersonByName( String name );
> ПК>

> ПК>И не нужно никаких лишних комментариев и, тем более, исключений.

> Кстати, в C# с большой вероятностью, а в Яве так на 100% Person будет ссылочным типом, так что даже Person? и т.п. не потребуется. Можно просто возвращать null если человека нет.


Прошу прощения. Не посмотрел на семантику nullable types в C#. Этот вариант вычеркиваем. Мало того, что это не работает с reference types, так еще и приведение неявное. Речь как раз шла о том, чтобы во время компиляции ловить случаи, в которых программист не проверил результат на существование. Результат (Person)null этого не требует, т.к. по типу не отличается от валидных значений Person.

boost::optional<Person>, с другой стороны: 1) исключает попытки работы с результатом findPersonByName без предварительной проверки, что вернули непустое значение; 2) явно говорит о том, что может быть возвращено пустое значение, перенося комментарии в код.

Т.е., например, так сделать не получится:
void f( const Person& );
. . .
f( findPersonByName( name ) );

Программист получит ошибку компиляции, и обратит внимание на то, что findPersonByName может вернуть пустой результат.
Posted via RSDN NNTP Server 2.0 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[25]: Checked exceptions... зло или добро?
От: Павел Кузнецов  
Дата: 23.07.05 06:11
Оценка:
VladD2,

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

ПК>> В этих традициях написана VM того же .Net: посмотри, как там с помощью

ПК>> _ASSERTE проверяются предусловия и постусловия. В случае их нарушения
ПК>> никаких исключений не будет. Все просто "тихо" упадет.

V> _ASSERTE работает только в дебаге. И даже в нем от него ничего не

V> упадет. А вот AV после словить можно.

Это (например, AV) и было обозначено словами "тихо упадет".

V> Думаю, выбор _ASSERTE здесь был обусловлен тем, что это все же код ядра

V> и напрямую его никто вызывать не будет (а значит его можно как следует
V> отестировать)

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

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

Соответственно, эта часть ответа на вопрос "почему их в release
версии не превращают в исключения?" неверна. Вовсе не потому, что VM
можно хорошо протестировать, и это делается. Причина -- в другом.

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

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

V> ну, и требованиями производительности. Все же все эти проверки потребляют

V> время, а в ядре рантайма это может оказаться критическим.

Если не строить догадки, а посмотреть на код, то можно будет увидеть, что
в подавляющем количестве мест, где используются _ASSERTE, стоимостью
выполняемых проверок можно абсолютно смело пренебречь. По крайней мере,
по сравнению с окружающим кодом. Например:
void AppDomain::ExceptionUnwind(Frame *pFrame)
{
    LOG((LF_APPDOMAIN, LL_INFO10, "AppDomain::ExceptionUnwind for %8.8x\n", pFrame));
#if _DEBUG_ADUNLOAD
    printf("%x AppDomain::ExceptionUnwind for %8.8p\n", GetThread()->GetThreadId(), pFrame);
#endif
    Thread *pThread = GetThread();
    _ASSERTE(pThread);

    // if the frame was pushed in managed code, then the cleanup in the managed code finally will
    // already have popped returned from the context, so don't need to do anything. However, if we
    // are still the current frame on an ExceptionUnwind, then we need to clean ourselves off. And if
    // the frame was pushed outside of EnterContext as part of a failed attempt to enter the context
    // then the return context will be null, so don't need to do anything with this frame.
    Context *pReturnContext = pFrame->GetReturnContext();
    if (pReturnContext && pThread->GetContext() != pReturnContext)
    {
        pThread->ReturnToContext(pFrame, FALSE);
    }

    if (! pThread->ShouldChangeAbortToUnload(pFrame))
    {
        LOG((LF_APPDOMAIN, LL_INFO10, "AppDomain::ExceptionUnwind: not first transition or abort\n"));
        return;
    }

    LOG((LF_APPDOMAIN, LL_INFO10, "AppDomain::ExceptionUnwind: changing to unload\n"));

    BEGIN_ENSURE_COOPERATIVE_GC();
    OBJECTREF throwable = NULL;
    CreateExceptionObjectWithResource(kAppDomainUnloadedException, L"Remoting_AppDomainUnloaded_ThreadUnwound", &throwable);

    // reset the exception to an AppDomainUnloadedException
    if (throwable != NULL)
        GetThread()->SetThrowable(throwable);
    END_ENSURE_COOPERATIVE_GC();
}

Я не буду приводить множество других фрагментов кода VM, содержащих _ASSERTE.
Этот вполне характерен. Даже если допустить, что часть остальных фрагментов
содержит гипотетические "дорогие" проверки, вполне можно было бы ввести
две разновидности _ASSERTE, одну для "дорогих" проверок, другую -- для
"дешевых", и превращать в выбрасывание исключений только последние. Этого
тоже не сделали.

В общем, полагаю, должно быть понятно, что и вторая из названных тобой причин,
не объясняет, почему же проверки, диагностирующие ошибки программирования,
в release версии VM исключения не бросают, а просто убираются, оставляя
программу на произвол AV, как ты верно заметил.

Холодно.

V> Однако, если ты посмотришь мнее предвзято, то заметиль, что код ядра

V> генерирует не мало исключений.

О! Теплее... Теперь осталось понять, где же проходит эта самая граница,
разделяющая assert и выбрасывание исключения. Я приведу еще один фрагмент
кода, где эту разницу можно уловить чуть получше:
void BaseDomain::AllocateObjRefPtrsInLargeTable(int nRequested, OBJECTREF **apObjRefs)
{
    THROWSCOMPLUSEXCEPTION();
    CHECKGC();

    _ASSERTE((nRequested > 0) && apObjRefs);

    Thread *pThread = SetupThread();
    if (NULL == pThread)
    {
        COMPlusThrowOM();
    }

    // Enter preemptive state, take the lock and go back to cooperative mode.
    pThread->EnablePreemptiveGC();
    m_pLargeHeapHandleTableCrst->Enter();
    pThread->DisablePreemptiveGC();

    EE_TRY_FOR_FINALLY
    {
        // Make sure the large heap handle table is initialized.
        if (!m_pLargeHeapHandleTable)
            InitLargeHeapHandleTable();

        // Allocate the handles.
        m_pLargeHeapHandleTable->AllocateHandles(nRequested, apObjRefs);
    }
    EE_FINALLY
    {
        // Release the lock now that the operation is finished.
        m_pLargeHeapHandleTableCrst->Leave();
    } EE_END_FINALLY;
}


ПК>> При этом проверки в критических местах уже присутствуют.

ПК>> Вопрос: почему их в release версии не превращают в исключения?
ПК>> Ответ на этот вопрос поможет понять позицию, которую я в этой теме
ПК>> озвучивал.

V> Не поможет. Так как в релизе они с вероятностью в 99% превратятся в AV

V> со всеми вытекающими.

Что ты подразумевал под словами "они"? "Исключения" или "случаи, проверяемые
с помощью _ASSERTE, если последние будут отключены, как это и происходит по
умолчанию"? Если второе -- очевидно, что во многих из мест, где расставлены
_ASSERTE, будут сгенерированы AV и т.п. Вопрос как раз в этом и заключается:
почему Microsoft не пошли по, вроде бы, перспективному по твоим словам пути,
и не превратили эти _ASSERTE в релизной версии в исключения?

Прохладно...

ПК>> Тестирование миллионами пользователей здесь вообще ни при чем, т.к.

ПК>> ошибки из разряда "вылетов" виртуальной машины пользователи
ПК>> рапортовать просто не должны.

V> Должен, не должен. А оно есть. Как факт. И ничего ты с этим не поделашь.


Так ты так и не ответил, почему же разработчики VM предпочли "вылеты"
порождению исключений? Ведь множество проверок по коду уже расставлено.
Казалось бы -- сделай в релизе
#define _ASSERTE(x) do { if (!x) throw ...; } while (0)

и VM станет надежнее. Так почему, все-таки, этого не сделали?

ПК>> Их нужно отлавливать "до того", на этапе разработки и внутреннего

ПК>> тестирования. То же самое верно и для прикладных приложений.

V> Желательно отлавливать до. Но никто от ошибок не застрахован.

V> И ассерт может быть не верным, в конц концов.

Ага. Теплее. Одна причина, наконец, названа: диагностика ошибок может
содержать ошибки, и, соответственно, может снижать надежность
программы
, внося в нее дополнительную сложность. Но, учитывая
тривиальность подавляющего количества _ASSERT, эта причина сама по себе
не могла перевесить декларируемые положительные стороны для повышения
надежности программы путем сообщения об ошибках программирования
с помощью исключений. Какие же еще причины, которые, действительно,
объясняют, почему же _ASSERTE просто-напросто выбрасывают из release
версии VM?

ПК>> Бывают исключительные ситуации, которые программа и должна

ПК>> обрабатывать: нехватка ресурсов

V> А она отчего появилась?


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

ПК>> какие-то нарушения в окружении,


V> А они откуда?


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

ПК>> неверные данные


V> Как не верные? Значит опять ошибка програмиста?


Нет, опять холодно. Это, например, неправильный ввод пользователя (ввел
"100" там, где больше "10" вводить нельзя). Или же сбой дисковой подсистемы,
скажем, файл с данными запорчен из-за "плохого сектора". Или просто
злобный пользователь взял, да и удалил файл, в котором хранились данные
приложения. В общем, снова-таки, возникновение этих ситуаций объясняется
не ошибками в программе, а какими-то совершенно внешними факторами.
Posted via RSDN NNTP Server 2.0 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[26]: Checked exceptions... зло или добро?
От: Cyberax Марс  
Дата: 23.07.05 14:18
Оценка:
VladD2 wrote:

> C>Быстрый метод использует закэшированные локально преобразования (в виде

> C>слинкованого бинарного изображения из собственного JIT-компилятора).
> C>Если встречается неизвестное преобразование — включается второй режим,
> C>когда преобразования врубаются в интерпретируемый режим с параллельной
> C>перекомпиляцией.
> Думаю, в вашей ситуации разумно было бы передавать версию протокола в
> заголовке. Тогда сравнив ее с закэшированной можно было бы выбрать
> нужный метод без спарсинга.

Версия протоколоа не подойдет (по причине полного ее отсутствия), помог
бы список используемых фильтров с SHA-timestamp'ами их кода. Однако:
1. Получится большая избыточность.
2. Текущий формат может быть прочитан исключительно последовательно и
добавления/изменения делаются простым append'ом.

> C>И не надо предлагать мне использовать .NET и не мучаться с ручным

> JIT-ом...
> Я даже подумать не успел, а ты уже хорошее решение придумал.

Я бы с удовольствием это решение использовал, но оно должно работать на
устройствах, где .NET не будет еще очень долго.

--
С уважением,
Alex Besogonov (alexy@izh.com)
Posted via RSDN NNTP Server 1.9
Sapienti sat!
Re[27]: Checked exceptions... зло или добро?
От: VladD2 Российская Империя www.nemerle.org
Дата: 23.07.05 16:46
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Версия протоколоа не подойдет (по причине полного ее отсутствия), помог

C>бы список используемых фильтров с SHA-timestamp'ами их кода. Однако:
C>1. Получится большая избыточность.
C>2. Текущий формат может быть прочитан исключительно последовательно и
C>добавления/изменения делаются простым append'ом.

Ну, вот и нужно было ввести версию протокола. Это и есть ошибка дизайна. Если эта версия зависит от фильтров, то достаточно создать мап филтров к версиям протоколов.
... << RSDN@Home 1.2.0 alpha rev. 587>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[28]: Checked exceptions... зло или добро?
От: Cyberax Марс  
Дата: 23.07.05 17:07
Оценка:
VladD2 wrote:

> C>Версия протоколоа не подойдет (по причине полного ее отсутствия), помог

> C>бы список используемых фильтров с SHA-timestamp'ами их кода. Однако:
> C>1. Получится большая избыточность.
> C>2. Текущий формат может быть прочитан исключительно последовательно и
> C>добавления/изменения делаются простым append'ом.
> Ну, вот и нужно было ввести версию протокола. Это и есть ошибка
> дизайна. Если эта версия зависит от фильтров, то достаточно создать
> мап филтров к версиям протоколов.

Я же говорю — не подойдет. Фильтры не одни мы пишем, так что
централизованых версий нет в принципе.

--
С уважением,
Alex Besogonov (alexy@izh.com)
Posted via RSDN NNTP Server 1.9
Sapienti sat!
Re[29]: Checked exceptions... зло или добро?
От: VladD2 Российская Империя www.nemerle.org
Дата: 24.07.05 00:43
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Я же говорю — не подойдет. Фильтры не одни мы пишем, так что

C>централизованых версий нет в принципе.

Ну, распознаете же вы их на клиенте? Значит и на сервере распознаете. Вот распозновайте и создавайте некую чексумму которую и отправляйте на клиента в заголовке. Если она не совпала, то...
... << RSDN@Home 1.2.0 alpha rev. 587>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[24]: Checked exceptions... зло или добро?
От: Cyberax Марс  
Дата: 24.07.05 10:10
Оценка:
VladD2 wrote:

> C>С завидной переодичностью получаю OutOfMemory — несколько раз в неделю,

> Видимо когда мы бэкапы делаем.

Может быть...

> C>иногда не дает с постить с ошибкой о недостаточности прав и т.п.

> А это скорее всего тему удалили. При этом она переносится в форум
> Мусор в который писать никто не может.

Нет, тема обычно остается живая.

--
С уважением,
Alex Besogonov (alexy@izh.com)
Posted via RSDN NNTP Server 1.9
Sapienti sat!
Re[29]: Checked exceptions... зло или добро?
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 24.07.05 18:11
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Купи себе USB2-винт. Положи на него БД от януса и пользуйся с любой машины.


Только джет, боюсь, будет себя на медленном винте вести непотребно.
... << RSDN@Home 1.2.0 alpha rev. 592>>
AVK Blog
Re[26]: Checked exceptions... зло или добро?
От: dshe  
Дата: 24.07.05 18:55
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, dshe, Вы писали:


D>>Приведу еще один небольшой аргумент в пользу исключений. Исключения могут с собой нести некоторую дополнительную информацию. Например, PersonNotFoundException мог бы содержать имена существующих людей, которые наиболее близки к искомому. Эту информацию можно было бы использовать для того, чтобы помочь пользователю в его поиске. Признаюсь, я очень редко пользовался этой возможностью и еще реже видел, чтобы класс исключения (написанный не мной) содержал в себе что-то более чем error message.


VD>Ужасный аргумент. В таких случаях лучше сделать отдельную функцию которая возвратит результат запакованным в объект хранящий эту дополнительную информацию. А использовать в таких случаях исключения как раз самое неверное решение.


В силу указанных ранее причин:
1. неочевидность (неявность) связей и взаимодействия (Павел Кузнецов: http://www.rsdn.ru/Forum/Message.aspx?mid=1284040&amp;only=1
Автор: Павел Кузнецов
Дата: 20.07.05
)
2. в больших количествах исключения существенно подтормаживают скорость выполнения приложения (IT: http://www.rsdn.ru/Forum/Message.aspx?mid=1284093&amp;only=1
Автор: IT
Дата: 21.07.05
)
3. сложности в отладке (IT: http://www.rsdn.ru/Forum/Message.aspx?mid=1284093&amp;only=1
Автор: IT
Дата: 21.07.05
, alexeiz: http://www.rsdn.ru/Forum/Message.aspx?mid=1285986&amp;only=1
Автор: alexeiz
Дата: 21.07.05
)

или есть еще другие?
--
Дмитро
Re[23]: Checked exceptions... зло или добро?
От: vdimas Россия  
Дата: 25.07.05 12:37
Оценка:
Здравствуйте, IT, Вы писали:

IT>Здравствуйте, vdimas, Вы писали:


V>>Разве это стателесс?


IT>Если вы не сохраняете эти данные сразу в базе, а храните в памяти сервера, то нет, конечно. А в чём проблема была хранить набиваемые данные на клиенте?


Да проблема в трафике и в лишних методах прикладных интерфейсов. Нам бы пришлось для каждой сущности в случае нужды предварительной верификации на стороне апп-сервера гнать туда наши stateless-данные. А так мы просто перегоняем данные на EntityView на сторону сервака и вызываем общий метод Validate (что-то типа такого). Адаптер этого EntityView на ГУИ каждый раз в Send() шлет только измененные поля либо изменения списков связанных объектов с момента последней пересылки. Т.е. получился весьма общий механизм на предварительную пересылку и валидацию данных. Во время операции Save() отсылаются последние изменения, иже таковые были, и затем в рамках транзакции на серваке применяеются накопленные в EntityView изменения.

В общем, такая потребность вообще возникла из-за необходимости в некоторых местах явного разделения операций сохранения и валидации. В нашем случае, юзер редактирует некий Job, и периодически проверяет текущие набитые данные на валидность без сохранения (так они хотели).
Re[20]: Checked exceptions... зло или добро?
От: WolfHound  
Дата: 25.07.05 15:10
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Потому как кто к нам счем прийдет от того и помрет.

Кто к нам с чем тот от того и затем.
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[17]: Checked exceptions... зло или добро?
От: Andrei N.Sobchuck Украина www.smalltalk.ru
Дата: 25.07.05 16:11
Оценка:
Здравствуйте, Cyberax, Вы писали:

>>>> Программист скажет. Ну, вылетит программка при тестировани...

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

C>Мне вот так не кажется. Проверяемые исключения рассматриваются как часть

C>сигнатуры функции — то есть как часть ее типа. Точно так же, как и
C>статическая типизация, проверяемые исключения позволяют находить ошибки
C>во время компиляции.

Всё ж это зависит от того, для чего механизмом исключений пользоваться.

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

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

Проверяемые исключения полезны только в первом случае.

И еще, можно заметить, что при наличии штатных средств исключения были бы не нужны. Например, твой случай это имитация откатов. Ничего плохого в использовании механизма исключений для реализации всех этих /непредусмотренных языком/ возможностей как бы и нет, за исключением (уж, извините за тавтологию) того, что среда может неадекватно реагировать на использование исключений для в "штатных" ситуациях. Плюс, если не готов к подобным "штатным" ситуациям, то легко, перехватив "лишнее" исключение, что-то поломать.
... << RSDN@Home 1.1.4 stable rev. 510>>
Я ненавижу Hibernate
Автор: Andrei N.Sobchuck
Дата: 08.01.08
!
Re[18]: Checked exceptions... зло или добро?
От: Cyberax Марс  
Дата: 25.07.05 16:56
Оценка:
Andrei N.Sobchuck wrote:

> C>Мне вот так не кажется. Проверяемые исключения рассматриваются как

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

Как раз именно для ошибочных ситуаций, предусмотренных разработчиком.
Например, метод write в класса Socket вполне логично может кидать
ConnectionTerminatedException (наследник от IOException), и вполне
логично задекларировать это исключение в сигнатуре метода.

--
С уважением,
Alex Besogonov (alexy@izh.com)
Posted via RSDN NNTP Server 1.9
Sapienti sat!
Re[21]: Checked exceptions... зло или добро?
От: pvgoran Россия  
Дата: 25.07.05 18:52
Оценка: :)))
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, VladD2, Вы писали:


VD>>Потому как кто к нам счем прийдет от того и помрет.

WH>Кто к нам с чем тот от того и затем.

Не-а. "Кто к нам с чем зачем, тот от того и того."
... << RSDN@Home 1.1.4 stable rev. 510>>
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.