powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Обработка исключений или иной механизм.
4 сообщений из 4, страница 1 из 1
Обработка исключений или иной механизм.
    #34489160
Фотография pamir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Домашний проект, но хочется сделать его по-человечески.
Подскажите, как реализуется механизм передачи из функции в функцию (и в итоге на клиента) сообщений об ошибках в бизнес-логике. Например, передан несуществующий код чего-либо или пользователь пытается выполнить неположеную операцию.
В оракле это делалось бы с помощью пользовательских исключений - их можно насоздавать своих, каждая со своим кодом (ну или код один, но в тексте предусматривается тэг с кодом для расшифровки).
Как реализуется в постргесе?

Пример функция f1 вызывает f2, которая вызывает f3. В последней оказывается, что какой-либо параметр пустой (или не верный или еще что-то). Необходимо прервать f3, вернув в f2 что-то осмысленное. Прервать f2, вернув в f1 и наконец прервать f1, вернув на клиента нечто, что скажет клиенту, что произошла ошибка и какая это ошибка.
Можно реализовать, например, так, чтобы возвращаемые значения говорили об ошибке (например, отрицательное значение говорит об ошибке, а величина - код этой ошибки), но! функция не обязательно должна возвращать число. Она же может при корректной работе возвращать, например, дату.

В общем-то, может быть все реализуется как и в оракле, просто нужно подтверждение, что это так.
И еще - клиент джавиный, ему доступны сообщения об ошибках? Как я понял, код при raise error будет один и тот же...
...
Рейтинг: 0 / 0
Обработка исключений или иной механизм.
    #34490559
st_serg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как в оракле у вас навряд ли получиться, хотя бы изза различий в управлении транзакциями.
мож быть сделать механизм вроде виндового, а-ля GetLastError или errno(3) в unix-like системах?
...
Рейтинг: 0 / 0
Обработка исключений или иной механизм.
    #34490702
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pamir...Пример функция f1 вызывает f2, которая вызывает f3. В последней оказывается, что какой-либо параметр пустой (или не верный или еще что-то). Необходимо прервать f3, вернув в f2 что-то осмысленное. Прервать f2, вернув в f1 и наконец прервать f1, вернув на клиента нечто, что скажет клиенту, что произошла ошибка и какая это ошибка.......


как вариант - написать хранимки на сях...там всё это можно реализовать. и код возврата (строка, код) и механизация эксепшенов самого языка и абортирование всего запроса, и создание сиквол подзапросов...короче говоря - на вкус и цвет...


с уважением
(круглый)
...
Рейтинг: 0 / 0
Обработка исключений или иной механизм.
    #34490964
Фотография pamir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
си это не мое.
Вот провел эксперимент.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
CREATE OR REPLACE FUNCTION f1()
  RETURNS timestamp without time zone AS
$BODY$declare
  l_ret timestamp;
  l_status numeric;
begin
  raise notice 'in f1';
  l_ret=now();
  l_status= 1 / 0 ;
  raise notice 'finish f1';
  return l_ret;
end;$BODY$
  LANGUAGE 'plpgsql' STABLE;

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
CREATE OR REPLACE FUNCTION f2()
  RETURNS timestamp without time zone AS
$BODY$declare
  l_ret timestamp;
  l_status numeric;
  l_err text;
  l_tmp character varying( 10 );
begin
  raise notice 'in f2';
  begin
    l_ret=now();
    l_ret=f1();
  exception
    when others then
      --raise exception 'шозанах?';
      l_err = SQLERRM;
      raise exception '%', l_err;
  end;
  raise notice 'finish f2';
  return l_ret;
end;$BODY$
  LANGUAGE 'plpgsql' STABLE;

При вызове второй функции если раскомментировать raise exception 'шозанах?'; и убрать следующие строки, в приложении на джаве (ну и в пгАдмин) ловится мое сообщение, код 0, state = P0001.
Если оставить как есть - код и стэйт тот же, сообщение стандартное.
Если ошибку вообще не ловить, то код тот же, стэйт 22012, сообщение стандартное.

Таким образом, по "стэйт" можно понять - кто генерил эксепшн и в зависимости от этого копать сообщение. В него можно включить в каких-нибудь тэгах мой внутренний код ошибки и сообщение, если нужно. Например делать так
#ERR01# user code is empty

Далее разбирать регуляркой и ву а ля...

Мож я чего-то не заметил?
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Обработка исключений или иной механизм.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]