LINUX.ORG.RU

Exceptions


0

0

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

Спасибо.

anonymous

Ответ на: комментарий от Selecter

Это все основы. Это мне известно. Я о том, что не вижу преимущества исключительных ситуаций. Все это проще обрабатывалось проверкой возвращаемого значения. А так код становится нечитаемой чередой вложенных друг в друга try..except и try..finally (хотя try..finally мне даже нравится). Я хочу, чтобы кто-то рассказал, как правильно их использовать в действительно больших программах, а не на примере открытия файла. Ведь тогда сложность этих try..except действительно возрастает очень сильно. Я сейчас разрабатываю немаленькую систему и из-за этих exception'ов мне все время кажется, что что-то не так, все можно сделать проще...

anonymous
()
Ответ на: комментарий от anonymous

Вообще У Страуструпа есть кое что на эту тему. По-моему довольно внятно.

А вот насчет читаемости: это, видимо, просто привычка такая у Вас выработалась, потому что 25-30 if(...) ... else ... очень многим не кажутся такими уж читабельнами. А длинной череди try...catch быть не должно. Нужно только четко определиться где какие ошибки обрабатывать. Тогда код становится гораздо более читаемым.

devinull ★★
()
Ответ на: комментарий от devinull

Да, и кроме того, на Си народ периодически именно из-за отсутствия исключений скатывается аж до goto, что никаких положительных эмоций не вызывает.

devinull ★★
()
Ответ на: комментарий от devinull

> Да, и кроме того, на Си народ периодически именно из-за отсутствия исключений скатывается аж до goto, что никаких положительных эмоций не вызывает.

:) ядро-гавно.. там goto есть и не один ;-)
для справки - goto в С исполняется быстрее чем обработка исключений в C++ и прочих. 

Я как-то видел афигетельное применение exception - при побайтовом чтении из сокета и сборке пакета. Типа того, что надо принять четырёхбайтное целое, и пока оно полностью не пришло на каждый байт звенит исключение..и так на каждое поле пакета

MKuznetsov ★★★★★
()
Ответ на: комментарий от anonymous

> А так код становится нечитаемой чередой вложенных друг в друга try..except и try..finally
> (хотя try..finally мне даже нравится)

Это потому что ты эксепшены используешь, как если бы это был if с проверкой - а не надо =)
лови их лучше не с каждого вызова функции отдельно, а с одного логического бока. Т.е. в C имеем:

if (!(f = fopen(...))) /* error */
if (!fseek(...)) /* error */
if (!fread(...)) /* error */
if (!fwrite(...)) /* error */
...
if (!fclose(...)) /* error */

В плюсах (и питоне, и прочих):

try {
fstream f(...);
f.seekg(...);
f.get(...);
f.put(...);
...
} catch (fstream::failure e)
/* error */
}

Где-то так. И еще. Если проверять код возврата, то это приходится делать на всех уровнях софтины.
Скажем есть у тебя на C функция load_jpeg. Она сначала вызывает load_jpeg_header. На каждую строчку в обоих
будет по проверке кода возврата, плюс load_jpeg_header должна возвращать код ошибки в load_jpeg,
чтоб та могла его проверить. С исключениями, в load_jpeg_header у тебя обработки ошибок чтения нет
вообще - им там не место. Если такая ошибка возникнет, вылетает исключение, и его ловит catch в
load_jpeg. Т.е. ошибки можно обрабатывать не обязательно прямо в том месте кода, где они возникают,
а там, где это удобней всего (а это может быть на несколько вложенных вызовов функций выше).

int19h ★★★★
()

Всем спасибо за внятные объяснения. Что-то проясняется :) Буду медитировать над вашими словами. :)

anonymous
()
Ответ на: комментарий от MKuznetsov

>:) ядро-гавно.. там goto есть и не один ;-)

Ну, там как раз более или менее читаемо. То есть, его используют, но сильно не злоупотребляют. У меня с чтением из-за goto в ядре проблем не возникало.

>для справки - goto в С исполняется быстрее чем обработка исключений в C++ и прочих.

Разумеется. goto - это jmp на асме, а исключения - это ужас в плане скорости, по сравнению с goto. Но! Хоть исключения и можно использовать для всего, что в голову придет, их основное предназначение - обработка ошибок. Это именно _исключительная_ ситуация, которая возникает не часто, так что скорость генерации и разворачивания стека ( а при этом еще и деструкторы локальных объектов вызываются... ужас! ) практически никакой роли не играет. IMHO, единственное разумное применение исключений, кроме обработки ошибок - это возврат значения из глубокой рекурсии или чего-то в этом роде, когда скорость не важна. Там они тоже здорово выручают, именно потому, что _скорость не важна_.

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

>Я как-то видел афигетельное применение exception

Это уже клинический случай. Исключения тут не виноваты.

devinull ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.