@dlangru

Страница 105 из 719
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
Должен же вайбед понимать когда один из его обработчиков сдох
обращение по null-pointer не будет отработанно, скорее всего

потому что система прибьёт приложение

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 вообще не надо

На то он и геттер.

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