
Pavel
21.11.2016
14:11:22
Но соединение надо установить всего 1 раз

Dmitry
21.11.2016
14:32:59
Не мог бы глянуть мой код и если можешь прокомментировать основные косяки:
https://github.com/bubnenkoff/Geoportal2
Просто метод же у меня только разво при старте приложения вызывается или все же нет?

Pavel
21.11.2016
14:36:46
Я тебе даю некие общие рекомендации исходя из своего опыта ООП проектирования и разработки. А в частном случае сам думай :)

Dmitry
21.11.2016
14:37:14
А тоесть это частный случай? Понял

Google

Dmitry
21.11.2016
14:37:42
Но не мог бы ты или кто нить другой сделать небольшой код-ревью проекта. Хоть какие-то явные косяки чтобы указали мне

Pavel
21.11.2016
14:37:47
Ты дай ссылку на конкретный файл, а то ты просто на проект скинул
Я так понял что твое приложение не работает без БД, тогда тебе во всех местах где catch (Exception e) { надо в конце добавить throw e чтобы дальше пробрасывать исключение

Dmitry
21.11.2016
14:42:21
И типа в самом верхнем catch его можно было поймать?

Pavel
21.11.2016
14:42:31
Ну да
Но можешь даже и не ловить, просто вывалит трейс в консоль )
И у пользователя будет больше информации о том что произошло.

Dmitry
21.11.2016
16:07:04
так, ну вот допустим файл адекватно написан?
https://github.com/bubnenkoff/Geoportal2/blob/master/source/app.d
Есть какие-то сильные косяки?

Pavel
21.11.2016
16:09:25
Да
https://github.com/bubnenkoff/Geoportal2/blob/master/source/app.d#L102 вот этот метод отработает в любом случае но программа при этом не упадет, хотя должна

Dmitry
21.11.2016
16:10:45
типа если не смогли что-то там, то нужно эксепшен кинуть?

Google

Pavel
21.11.2016
16:12:26
да, и выйти из приложения, дальнейшая работа бессмысленна

Dmitry
21.11.2016
16:12:56
так сделать:
catch(Exception e)
{
writeln("Can't setup DB");
writeln(e.msg);
throw e;
}

Oleg
21.11.2016
16:17:19
@DmitryBubnenkov очень странно, что ты не понимаешь в чём смысл исключений, потому что это достаточно простая концепция
Пример: ты переезжаешь в другую квартиру и заказываешь машину и грузчиков отдельно. Грузчики приезжают, а машина нет — исключительная ситуация. Что могут делать грузчики? Грузить в несуществующую машину?)) Могут конечно просто перекладывать мебель из одного места в другое, но это бессмысленно. Но если, например, приехала машина, но не приехали грузчики, ты можешь обработать эту ситуацию и попросить помочь тебе соседей самостоятельно перетащить мебель.
Соответственно каждая исключительная ситуация образуется когда что-то идёт не по плану

Dmitry
21.11.2016
16:18:01
Мне просто опыта не хватает — мне никто не показывал как правильно

Pavel
21.11.2016
16:18:08
Но вообще это обобщенное исключение можно ловить на уровне выше

Dmitry
21.11.2016
16:18:27
и там в main все обернуть блоком try

Oleg
21.11.2016
16:18:33
зачем?
если программа не может работать, например, без подключения к базе, то какой смысл оборачивать в main всё?
что она сделает то в итоге?

Dmitry
21.11.2016
16:19:13
м... а ну хотя наерно смысла нет... тут же получается throw приложение просто прервет?

Oleg
21.11.2016
16:19:20
только сообщение выведет?

Dmitry
21.11.2016
16:19:28
ну да я думал хотя бы сообщение

Oleg
21.11.2016
16:19:30
и так исключение сообщение выбросит
ну, если ты, конечно, хочешь его перевести на русский, например, то, да — его нужно перехватить, что-то сделать и завершить программу

Dmitry
21.11.2016
16:20:39
и приложение просто прекратит работу. Просто я думал работу приложения вкидыванием голого throw прерывать нельзя

Oleg
21.11.2016
16:21:02
не стильно
но не нельзя

Google

Dmitry
21.11.2016
16:21:27
Ну я читал что там с GC какая то заморочка, но это без отношение к thow

Oleg
21.11.2016
16:21:46
когда приложение завершается система высвобождает ресурсы, которые оно занимало
так что gc, rc вообще без разницы
хотя некоторые ресурсы (не подконтрольные системе) высвободить стоит, но тут совсем другая история)

Dmitry
21.11.2016
16:24:15

Oleg
21.11.2016
16:24:23
хотя тут всё-таки стоит высвобождать всё, вспомнил ситуацию: пробовал работать с несколькими вебками одновременно в одном приложении и если оно падало драйвер не мог потом эти камеры отдать (которые по usb к ноуту были подключены), а потом так и вообще всё легло с kernel panic (баг в дровах был для usb3)

0x9d8e
21.11.2016
16:25:18
Файлы тоже хорошо бы закрывать

Dmitry
21.11.2016
16:25:32
ну там мне Павел говорит, про какой-то хэндлер
Я не понимаю вообще что это такое

Oleg
21.11.2016
16:25:44

0x9d8e
21.11.2016
16:25:57
Не уверен

Oleg
21.11.2016
16:26:24
в любом случае это более правильный подход
всё аккуратненько освободить, закрыть и разъеденить

0x9d8e
21.11.2016
16:27:23
Надо поэкспирементировать, но в любом случае правильнее будет закрывать, а не надеяться что система всё всегда сделает как надо. А то это как вёрста под ие6 с незакрытыми тегами "браузер сам закроет"

Oleg
21.11.2016
16:28:40

Dmitry
21.11.2016
16:29:05
А как ты считаешь void надо делать или как павел предлагает через return?

Oleg
21.11.2016
16:30:31
наверное не считаю никак))) потому что это конкретный случай реализации архитектуры и общие какие-то правила я бы не стал советовать
я бы сделал return если бы это было удобней конкретно мне в каком-то конкретном случае
хотя, наверное в твоей ситуации сделал бы return

Google

Oleg
21.11.2016
16:31:50
потому что тогда бы не парился о наличии объекта при попытке его использовать
геттер это делал бы за меня
если бы инициализация поля происходила бы всегда в конструкторе и нельзя было бы создать объект без создания этого поля, то я бы не делал геттер

Dmitry
21.11.2016
16:40:55
блин не понимаю разницу:
"потому что тогда бы не парился о наличии объекта при попытке его использовать"
если же его нет, то я его создаю. Какую роль тут return играет
А на сколько у меня этот файл адекватно написан? https://github.com/bubnenkoff/Geoportal2/blob/master/source/dbconnect.d

Pavel
21.11.2016
16:57:09
catch(Exception e)
{
writeln(e.msg);
}
Да у тебя везде там просто ловится исключение и все

Dmitry
21.11.2016
16:57:21
как быть если к примеру метод:
getBaseMapVectorLayers упал ? что возвращать и куда?

Pavel
21.11.2016
16:57:22
Но программе все равно упадет

Admin
ERROR: S client not available

Pavel
21.11.2016
16:57:46
Только с более непонятной ошибкой, типа cant access to object because it is null

Dmitry
21.11.2016
16:58:00
во да только что упала! ты как в воду смотрел!
object.Error@(0): Access Violation
0x0044E752 in vibe.data.json.Json dbconnect.GeoDataBase.getBaseMapVectorLayers(vibe.data.json.Json)

Pavel
21.11.2016
17:02:11
?

Dmitry
21.11.2016
17:05:01
Так, ну вот как мне быть-то? Что делать если один из методов обращения к БД падает?
Типа оборачивать каждый метод в try ?
и там прокидывать исключение уровнем выше?

Oleg
21.11.2016
17:26:03
машины нет, что делать?)
ничего не делать)))
если нет подключения к базе, то прога должна упасть

Google

Dmitry
21.11.2016
17:27:09
дык я не могу понять почему блок подключения обернутый 10 раз catch ничего не ловит

Pavel
21.11.2016
17:27:36
он ловит, ошибка вне его возникает
когда код пытается использовать переменную в которой нету раельного коннекта

Dmitry
21.11.2016
17:28:54
а почему вне него? Или оно не последовательно работает? Я думал так: прога проверяет есть ли коннект, потом запускает метод получения данных из него
А тут не понятно почему кооект с неправильными реквизитами ничего не падает на них
типа неправильное подклчение заполняет объект коннекта?
Statement stmt;
try
{
stmt = conn.createStatement();
}
catch(SQLException e)
{
writeln("Снова пытаемся поймать и не получается: ", e.msg); // 0x0044E76B in vibe.data.json.Json dbconnect.GeoDataBase.getBaseMapVectorLayers(vibe.data.json.Json) dbconnect.d(235)
}

Oleg
21.11.2016
19:20:38

Dmitry
21.11.2016
19:25:31
А что это значит?

Oleg
21.11.2016
19:26:45
Это значит что ты ловишь исключения не того типа, который там выкидывается
И судя по всему у тебя там null проскакивает
При парсинге json каких-то полей судя по всему не хватает, а дальше уже как оно там сделано: может SQL запрос тупо выдает null при ошибке, может исключение, может он вобще ничего не делает, а можт БД не заполнена
Отладчиком смотрел?
С отладчиком можно все catch поубирать, и просто дебажить во все поля

Dmitry
21.11.2016
19:34:24
"Это значит что ты ловишь исключения не того типа, который там выкидывается"
А базоый Exception все типы ловит или нет?

Oleg
21.11.2016
19:35:13
В документации D должно быть написано, но наврное да

Dmitry
21.11.2016
19:36:36
У меня пароль к ней не верно указан и я не могу понять почему оно так странно себя ведет
хотя и с правильным паролем что-то падает так же

Oleg
21.11.2016
19:41:14
Отладчиком его

Dmitry
21.11.2016
19:46:28
Каким проще всего? Рассчет именно на новичка

Oleg
21.11.2016
19:49:21
Ребята в чате подскажут

Денис
21.11.2016
19:51:41