@dlangru

Страница 64 из 719
Dmitry
05.09.2016
13:39:08
а почему и как надо сделать?

Eto
05.09.2016
13:40:30
scope(failure) и так выполняется на ошибке, а ты внутри ещё одну хочешь кинуть.

Библиотека твоя?

Как-то не правильно для библиотеки кидать Error. Возможно в ней баг или недоработка.

Google
Dmitry
05.09.2016
13:42:17
нет не моя

бибилиотека во время отправки данных не обрабатывает обрыв подключения

Eto
05.09.2016
13:42:42
Лови данный Error там где используешь библиотеку. Что-то вроде: catch (Error e) { ...}

Dmitry
05.09.2016
13:42:56
я пытаюсь в раиках самообразования понять как это исправить

вот: https://github.com/ikod/dlang-requests/blob/5a501e3797bc48c5c75d864d05a749df80534961/source/requests/ftp.d#L139

Ловить Эксепшены надо когда они явные(предусмотренные) если что-то непонятное происходит, то это уже Error так?

Просто почему в коде тогде все эксепшены ловят, а error нет? Все надеются, что исполнители либ предусмотрели все очевидные проблемные места?

Eto
05.09.2016
13:46:58
В D базовый класс для ошибок - Throwable. От него наследуются Error и Exception. Разница между ними в том, что Error предназначен для критических ошибок. Подразумевается, что с ними ничего нельзя сделать во время исполнения, почему, собственно, assert кидает Error.

Dmitry
05.09.2016
13:50:30
Ну вот тут оно по логике что должно было бы кидать? error или что?

в момент обрыва соединения

Eto
05.09.2016
13:52:31
Exception.

Dmitry
05.09.2016
13:52:55
А error в каком случае должно было бы?

Eto
05.09.2016
13:54:04
В debug-версии на невалидный вызов какого-нибудь метода.

Google
Eto
05.09.2016
13:55:06
Хотя, для библиотеки, такое только в особых случаях.

Dmitry
05.09.2016
13:56:47
так. А если автор либы вообще эксепшены нигде на бросает, то в блок catch в случае ошибки что будет попадать?

Eto
05.09.2016
14:02:02
Что будет попадать, то и будет попадать.

Dmitry
05.09.2016
14:03:38
как я понимаю кидается объект исключения с определенным текстом, который дальше в проге и ловится. Верно? Если его не будет, то будет ловиться какая-то каша?

Eto
05.09.2016
14:13:32
Какая каша?

Dmitry
05.09.2016
14:15:28
а что тогда будет ловиться? Если либа ничего не кинула

Max
05.09.2016
14:29:00
Если ни либа ни твой код ничего не кидают - ничего ловиться и не будет

Макс
06.09.2016
05:19:38
Если ни либа ни твой код ничего не кидают - ничего ловиться и не будет
Ну, в принципе, какая-нибудь нижележащая либа может что-то бросать. Например, про обрыв соединения или отсутствие доступа к файлу. Автор либы вряд ли предусмотрел всё, да ему это и не нужно было, он ведь знал, что исключения всё равно пробросятся выше.

Dmitry
06.09.2016
08:45:12
У Ди модель исключений больше всего на какой язык похожа?

Eto
06.09.2016
08:50:23
Стандартная тут модель. За исключением разницы между Error и Exception.

Dmitry
06.09.2016
10:19:02
Я никак не могу понять. Причем тут наследование от какого-то базового класса исключений. Вот я пишу throw new Exception("my exception") может тут имеется ввиду, что я создаю исключение с типом Exception или как?

Eto
06.09.2016
10:30:21
Ты ООП знаешь?

Dmitry
06.09.2016
10:31:42
Судя по всему хреново я его знаю

тут создается объект Exception

Pavel
06.09.2016
10:32:50
Ну да, создается и кидается как исключение

Oleg
06.09.2016
10:33:12
в С++ можно любой объект выкинуть)

а в D только то что наследуется от Throwable

так вот от Throwable наследуются Error и Exception

Dmitry
06.09.2016
10:33:44
В коде выше получается кидается тот самый базовый класс исключений о котором в документации пишут?

Oleg
06.09.2016
10:33:49
нет

Google
Oleg
06.09.2016
10:36:38
смысл в том, что Exception ловят и это нормально, а Error не ловят обычно, так как это какие-то серьёзные ошибки

обычно библиотечный код не выбрасывает Error

и его производные

их ловить не имеет смысла

ловить, если ты точно хочешь ловить нужно Exception

а если ты точно знаешь класс исключения, то сначала его а потом Exception

Dmitry
06.09.2016
10:38:11
Кинул тип Exception: throw new Exception("my exception") try { все хорошо} catch(Exception e) {выводим e} — поймал e c типом Exception так?

Oleg
06.09.2016
10:38:36
либо ты не всё написал, либо ты не понял сути исключений

catch не самостоятельный блок

он всегда идёт после блока try

Dmitry
06.09.2016
10:39:22
да я не все написал

Oleg
06.09.2016
10:39:58
try { somecode(); } catch( MySpecialException e ) { processSpecialException(e); } catch( Exception e ) { processOther(e); }

Oleg
06.09.2016
10:40:40
где-то далеко в somecode может быть выбрашено как MySpecialException так и MyScpecialException2

первое поймается первым блоком, а второе вторым, потому что MySpecialException должно наследоваться от Exception (в каком-то поколении)

проясняется?

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

и ловить "все" нужно в последнюю очередь, так как отдельный специализированный блок упрощает код обработки отдельных ситуаций

Dmitry
06.09.2016
10:43:10
Вот. Значит все же throw new Exception("my exception") это мы чисто бросаем класс Exception в чистом виде?

Oleg
06.09.2016
10:43:53
"чистый вид" это что?

Dmitry
06.09.2016
10:44:07
ну без наследования от него

Google
Oleg
06.09.2016
10:44:17
а где ты тут наследование увидел?

auto e = new Exception("msg"); throw e;

почти тоже самое

исключение такой же класс и так же порождаются объекты

просто их можно выбросить с помощью throw

Dmitry
06.09.2016
10:45:53
так. щас еще раз все перечитаю

буф... а можешь посоветовать какие-то статьи в инете где все для дураков разжевно? Вот практически с нуля

Eto
06.09.2016
10:48:29
catch (Exception e) поймает все исключения, которые наследуются от Exception.

Admin
ERROR: S client not available

Dmitry
06.09.2016
10:49:17
Я никак не пойму. Вот есть класс Exception в нем какие-то примитивы определены (если да то какие). Мы можем от него унаследоваться и создать что-то свое так?

Oleg
06.09.2016
10:55:25
Ты серьезно?

в С++ можно любой объект выкинуть)

а в D только то что наследуется от Throwable

так вот от Throwable наследуются Error и Exception

Ну так и от Exception тоже наследуется дальше

Для этого и существует возможность писать catch для разных типов

Иначе это вообще бы никакого смысла не имело

Dmitry
06.09.2016
10:58:25
Вот смотрю я на методы в https://dlang.org/phobos/std_exception.html и вижу что-то типа auto assertNotThrown и не понимаю где они должны\могли бы использоваться

Oleg
06.09.2016
10:58:31
А полей там 4 (на память): сообщение, файл, строка и следующее исключение

А причем тут std?

Google
Dmitry
06.09.2016
10:59:02
а я не туда даже смотрю?

Oleg
06.09.2016
10:59:08
Исключения это часть языка

Dmitry
06.09.2016
10:59:18
А эта фигня в std она зачем?

Oleg
06.09.2016
10:59:35
Некоторые удобные методы

суть assert — проверка

соответственно методы в std.exception что-то проверяют

по бОльшей части

соврал: исключения — часть рантайма всё-таки

но синтаксис встроен в язык

https://github.com/dlang/druntime/blob/master/src/object.d#L1619

можешь полностью изучить что из себя представляет иерархия Object -> Throwable -> Exception

Dmitry
06.09.2016
12:15:51
Так все кажись немного разобрался

может конечно опять что-то криво понимаю, но...

Щас все же свои мысли напишу. Если опять будет херня — так и скажите, чтобы я знал)

Есть базовый класс Exception. throw new Exception("my exception") Бросает исключение от этого базового класса. Если нужно что-то специфическое. Мы наследуемся от него и уже свое исключение реализуем. И потом его кидаем так?

И еще вопрос. Чем лучше исключения кодов возврата?

Dmitry
06.09.2016
12:19:49
фу. слава богу

Oleg
06.09.2016
12:20:19
И еще вопрос. Чем лучше исключения кодов возврата?
тем, что тебе не нужно прокидывать их через весь стек

прокидывать = писать обработку кода ошибки и если он плох, то дальше его передавать по цепочке вызовов вверх

Страница 64 из 719