
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

Eto
06.09.2016
11:10:38

Dmitry
06.09.2016
12:15:51
Так все кажись немного разобрался
может конечно опять что-то криво понимаю, но...
Щас все же свои мысли напишу. Если опять будет херня — так и скажите, чтобы я знал)
Есть базовый класс Exception.
throw new Exception("my exception")
Бросает исключение от этого базового класса.
Если нужно что-то специфическое. Мы наследуемся от него и уже свое исключение реализуем. И потом его кидаем так?
И еще вопрос. Чем лучше исключения кодов возврата?

Oleg
06.09.2016
12:19:41

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

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