
Oleg
15.11.2016
11:42:18
потокобезопасным stdout стал, когда его обернули в vibe shared FileLogger(stdout, stderr)

Oleg
15.11.2016
11:42:39
Должен же вайбед понимать когда один из его обработчиков сдох

Oleg
15.11.2016
11:43:12
потому что система прибьёт приложение

Google

Oleg
15.11.2016
11:44:03
Error исключения не перехватываются обычно, что тоже не очень
чтобы понять где падает я бы везде поставил логирование просто в stdout (stderr) и просто запустил бы через systemd, а там бы и время падения и логи посмотрел бы
обычный log из vibe делает это по дефолту
кстати сам класс FileLogger не обеспечивает потокобезопасность
там ручками сделали блокировки

Dmitry
16.11.2016
06:21:38
Пасибо, у меня на новой работе щас время нет проверить. Постараюсь выбрать время и затестить все

Matero
16.11.2016
06:22:13
Дмитрий, а на работе ты на чём кодишь? )

Dmitry
16.11.2016
07:03:36
Пока на Питоне тк ArcGIS на него завязан на 100%
Подскажите, как поймать исключение если соединение я создаю в конструкторе:
this(Config config)
{
this.config = config;
conn = ds.getConnection(); // в момент коннекта может кинуть исключение
}

Pavel
20.11.2016
18:16:55
Не нужно подключаться в конструкторе
В конструкторе только сетти свойства класса, а подключайся через отдельный метод

Dmitry
20.11.2016
18:17:32
а ок, пасибо
чnо-то не пойму что ему не нравится:

Google

Dmitry
20.11.2016
18:21:36
м... типа это у меня все вне метода получилось и висит в воздухе или как?

Pavel
20.11.2016
18:27:57
хыхы да
try catch вне метода

Dmitry
20.11.2016
18:29:19
м... тогда получается мне нужно отдельный метод коннект создать и вызываеть его т.к. дальше методы котые уже делают конкретную задачу с имеющимся подключением
А обработка в конструкторе чем чревата?

Pavel
20.11.2016
18:32:14
да впринципе ты можешь конектится в конструкторе и кидать исключение, но тогда
1) Тяжело будет тестировать класс. Ты не можешь создать объект без подключения к БД
2) Подключение будет неленивым
3) Нельзя создать несколько объектов и расшарить между ними подключение
Конструктор по дизайну хорошего кода не должен содержать никакой логики, только наполнение и инициализация своих свойств.

Dmitry
20.11.2016
18:33:19
значит отдельный метод реализовать?

Pavel
20.11.2016
18:33:26
да
Этот метод можно сделать приватным если никто извне не использует подключение, и в методах класса обращаться к нему
В тех, где реально требуется лезть в базу

Dmitry
20.11.2016
18:34:23
а как его принято называть? Просто Connect?

Pavel
20.11.2016
18:34:43
да как угодно, чтобы понятно было
initConnection(), connectToDb(), dbConnect()
можно назвать getConnection() и там описать логику что если подключения нету то создаем его, иначе возвращаем существующее

Dmitry
20.11.2016
18:35:57
я не совсем понял что значит обращаться к нему в метододах класса. Ты имешь ввиду обращаться к переменной внутри класса которая будет содержать в себе экземпляр подключения?

Pavel
20.11.2016
18:36:27
не к переменной, а к геттеру этой переменной
а геттер уже отвечает за инициализацию подключения

Dmitry
20.11.2016
18:37:11
геттеры вроде только в шарпе есть, я его почти не знаю

Pavel
20.11.2016
18:37:32
ну просто метод который возвращает эту переменную

Google

Dmitry
20.11.2016
18:37:53
а... щас попробую и покажу код

Pavel
20.11.2016
18:38:19
http://www.digitalmars.com/d/archives/56.html есть же геттеры
хотя.. там 2001 года сообщения )

Dmitry
20.11.2016
18:39:54
что то типа этого?

Pavel
20.11.2016
18:42:33
ага

Dmitry
20.11.2016
18:46:41
а что ему не нравится почему ошибка?
о
понял
надо так:
а устанавливать значение через return это хорошая практика?

Pavel
20.11.2016
18:50:51
Да только у тебя не учитвается что метод Connect() могут дернуть несколько раз
и он каждый раз будет пытаться установить соединение

Dmitry
20.11.2016
18:51:26
а как это предотвратить?

Pavel
20.11.2016
18:53:09
if (conn != null) {
return conn;
}

Dmitry
20.11.2016
18:55:14
ругается:
Error: use '!is' instead of '!=' when comparing with null
что-то не пойму почему тут is - она же тип проверяет

Pavel
20.11.2016
18:55:52
я на псевдокоде написал) Правильный синтаксис сам выбери )

Dmitry
20.11.2016
18:56:24
я понял, но тут же вроде мы не тип проверяем а значние
или null это тип?
походу да
А что возвращать во всех остальных случаях?

Google

Pavel
20.11.2016
18:58:52
этот метод должен либо вернуть conn либо выбросить исключение

Dmitry
20.11.2016
19:00:31
типа такого:
else
{
throw new Exception("Connection is already exists");
}

Pavel
20.11.2016
19:01:12
да нет
Ну это типа синглтон должен получиться
этот метод всегда возвращает соединение, а если оно не установлено, то устанавливает его

Dmitry
20.11.2016
19:02:14
не мог бы в коде показать, что-то не допру как это сделать можно

Admin
ERROR: S client not available

Pavel
20.11.2016
19:03:01
так я ж написал выше, этот код надо вставить в самое начало метода

Dmitry
20.11.2016
19:05:42
как то так? http://codepad.org/44ta5BUs
код ругается на:
Error: function dbconnect.GeoDataBase.Connect no return exp;

Pavel
20.11.2016
19:09:13
Connection Connect() // создаем объект подключения
{
if(conn is null)
{
conn = ds.getConnection();
}
return conn;
}

Dmitry
20.11.2016
19:09:48
м... тогда метод наверно void надо?

Pavel
20.11.2016
19:10:01
подредактировал

Dmitry
20.11.2016
19:10:32
я понял, но почему не void? Ведь мы просто значение переменной ставим

Pavel
20.11.2016
19:10:58
вернуть хендл соединения тоже надо

Dmitry
20.11.2016
19:11:21
что такое хэндл соединения и что будет если его не вернуть

Oleg
20.11.2016
19:33:06
просто на null проверка через is
типа стиль

Dmitry
21.11.2016
08:36:18
Так а если не делать проверку на то имеется уже ли соединение то откуда оно может повторно то взяться? Ведь по идее экземпляр подключения к бд создается один раз при старте приложения

Google

Dmitry
21.11.2016
13:52:57
Так и еще раз напомните. Если я просто ловлю общее исключение вида:
Exception e
т.е. без указания его типа навроде SQLException то какие минусы у этого подхода?

Alex
21.11.2016
13:56:56
неудобно

Dmitry
21.11.2016
13:58:44
а чем?
Просто я иногда ленюсь искать тип исключения который либа кидает

Pavel
21.11.2016
14:06:01
Это плохо тем что ты все исключения ловишь в одном месте, не всегда для этого подходящем
Если ты работаешь с БД то должен ловить только исключения, касающиеся БД.

Dmitry
21.11.2016
14:06:45
Иначе можно поймать не то исключение?

Pavel
21.11.2016
14:06:53
А то допустим ты поймал исключение о том что место на диске закончилось. Твой класс понятия не имеет как это обрабатывать, ведь он только с базой работает
А код который умеет такие случаи обрабатывать, не получит этого исключения
Но ты можешь после того как поймал исключение, кидать его дальше

Dmitry
21.11.2016
14:08:02
Так, а какой может быть сценарий если мы попали в блок исключения. Просто залоггировать и если оно не критичное, то продолжить выполнение?

Pavel
21.11.2016
14:08:03
поймал - что-то сделал (вывел ошибку) - дальше бросил это же исключение

Dmitry
21.11.2016
14:08:28
А где это бывает полезно?

Pavel
21.11.2016
14:09:04
Не знаю как это сформулировать даже :)

Dmitry
21.11.2016
14:09:27
а.... ну понял идею
а не мог бы в продолжении вчерашней темы ответить на вопрос:
а если не делать проверку на то имеется уже ли соединение то откуда оно может повторно то взяться? Ведь по идее экземпляр подключения к бд создается один раз при старте приложения

Pavel
21.11.2016
14:10:45
Ты этот метод getConnection() должен дергать каждый раз когда хочешь получить соединение. А обращаться в свойству conn вообще не надо
На то он и геттер.