powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Использование сообщения RAISERROR
11 сообщений из 11, страница 1 из 1
Использование сообщения RAISERROR
    #39752624
Игорь_UUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.

2 хранимые процедуры, первая вызывает вторую... если во второй процедуре в конструкции TRY..CATCH возникает ошибка, идёт её обработка и описание ошибки возвращается через RAISERROR в блоке CATCH.

Вопрос, можно ли каким-то образом текст ошибки получить в первой хранимой процедуре (которая вызвала вторую) передав её в переменную?
...
Рейтинг: 0 / 0
Использование сообщения RAISERROR
    #39752647
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Игорь_UUS, https://habr.com/post/358936/
:-)
Ну, перед тем, как читать MSDN.
...
Рейтинг: 0 / 0
Использование сообщения RAISERROR
    #39752695
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь_UUS,

почему в переменную? Исключение надо передавать на самый верхний уровень. Используйте Throw.
...
Рейтинг: 0 / 0
Использование сообщения RAISERROR
    #39752711
Игорь_UUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владислав КолосовИгорь_UUS,

почему в переменную? Исключение надо передавать на самый верхний уровень. Используйте Throw.

Throw не могу т.к. mssql2008
...
Рейтинг: 0 / 0
Использование сообщения RAISERROR
    #39752715
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь_UUS,

попробуйте в сочетании с SET XACT_ABORT = ON, у меня нет 2008, чтобы проверить.
...
Рейтинг: 0 / 0
Использование сообщения RAISERROR
    #39752743
Игорь_UUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владислав Колосов,

Дело даже не в этом... есть костыль для api...

Я бы сказал ответ верхнему ПО идёт по 2-м разным сценариям, в одном случае это десктоповое приложение, которое как раз таки обрабатывает ошибки как надо, и есть api, модули на php. Но вот обработка ошибок там идёт не так "как надо" в виде передачи ошибки в возвращаемую переменную.

А бизнес логика одна... т.е. интерфейсные хранимые процедуры десктоповой программы и интерфнйсные процедуры для api используют одни и те же процедуры бизнес логике. Информирование об ошибках (или уведомление) верхнему ПО идёт через RAISERROR и кода RETURN самой процедуры (если код = 0, то обработка прошла успешна). И получается, если по линии api идёт что-то не так, то как мне отловить то что было передано в "недрах бизнес логике" через RAISERROR
...
Рейтинг: 0 / 0
Использование сообщения RAISERROR
    #39752918
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь_UUS,

для реализации API обычно пишут процедуры - обертки, там простой SELECT ERROR_MESSAGE() в блоке CATCH.
...
Рейтинг: 0 / 0
Использование сообщения RAISERROR
    #39752949
Фотография Ennor Tiegael
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь_UUS,

Output variables можно использовать:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
create procedure dbo.Proc1
(
  ...
  @Error int = null output,
  @Message nvarchar(2048) = null output
)
as
...
begin catch

if nullif(@Error, 0) is null
  select @Error = error_number(), @Message = error_message();

...
end catch;
return;
go

Если такие параметры есть по всему стеку вызовов, то передать ошибку на самый верх можно безо всяких RAISERROR или THROW. Главное, не забывать добавлять output к этим параметрам при вызове из других хранимок. Ну и с транзакциями аккуратнее, следите за значением @@trancount (не забываем, что в сиквеле вложенных транзакций нет) и состоянием set xact_abort.
...
Рейтинг: 0 / 0
Использование сообщения RAISERROR
    #39753222
Игорь_UUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владислав КолосовИгорь_UUS,

для реализации API обычно пишут процедуры - обертки, там простой SELECT ERROR_MESSAGE() в блоке CATCH.


Но CATCH ловит только те сообщения, которые имеют уровень серьёзности более 10. В этом случае десктоповое приложение "кидает" исключение (так работает компонент FireDAC... уфф и это правильно)... тут придётся переделывать очень много, так сказать обернуть "верхние уровни" бизнес логики в блок CATCH и переориентировать ошибку в низкий уровень серьёзности...

я правильно понимаю, то что сообщения с уровнем серьёзности менее 11 перехватить или прочитать невозможно? т.е. таких методов в самом mssql нет?
...
Рейтинг: 0 / 0
Использование сообщения RAISERROR
    #39753234
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь_UUSя правильно понимаю, то что сообщения с уровнем серьёзности менее 11 перехватить или прочитать невозможно? т.е. таких методов в самом mssql нет?
RAISERROR c severity<=10 - это, по сути, обычные текстовые сообщения. Их вполне прекрасно можно прочитать в клиентском приложении (например, вот так , или вот так ).
...
Рейтинг: 0 / 0
Использование сообщения RAISERROR
    #39753298
Игорь_UUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сон Веры ПавловныИгорь_UUSя правильно понимаю, то что сообщения с уровнем серьёзности менее 11 перехватить или прочитать невозможно? т.е. таких методов в самом mssql нет?
RAISERROR c severity<=10 - это, по сути, обычные текстовые сообщения. Их вполне прекрасно можно прочитать в клиентском приложении (например, вот так , или вот так ).

В десктоповом приложении как раз таки полный порядок с "обычными сообщениями" (перехватываю и читаю)... а вот в "обёртках" для API - нет

вопрос можно ли их перехватить в бизнес логике MSSQL?
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Использование сообщения RAISERROR
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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