Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Перехват ошибки  [new]
Meriguan
Member

Откуда:
Сообщений: 124
Добрый вечер!
Столкнулся с небольшой проблемой.
Процедура отправки электронного письма в случае отсутствия вложения по указаному пути возвращает ошибку.
Перехватить ошибку и выполнить нужный блок нет проблем.
Как сделать что бы запрос не возвращал в Messages ошибку?

Ниже прилагаю скрипт.

BEGIN TRY
DECLARE @err int

EXEC @err = msdb.dbo.sp_send_dbmail
@profile_name = 'El_Info',
@recipients = 'irog12005@mail.ru',
@subject = 'TEST',
@file_attachments = '\\EL\Data\Refuse\1.xls'

IF @err != 0
RAISERROR ('Ошибка отправки письма клиенту',16,1)
END TRY
BEGIN CATCH
SELECT 2
END CATCH
20 сен 11, 17:53    [11307839]     Ответить | Цитировать Сообщить модератору
 Re: Перехват ошибки  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
Meriguan,

убрать RAISERROR ('Ошибка отправки письма клиенту',16,1) ?
20 сен 11, 17:55    [11307856]     Ответить | Цитировать Сообщить модератору
 Re: Перехват ошибки  [new]
Meriguan
Member

Откуда:
Сообщений: 124
WarAnt
Meriguan,

убрать RAISERROR ('Ошибка отправки письма клиенту',16,1) ?


Если убрать этот блок, то TRY...CATCH не перехватывает ошибку.

К стати сама ошибка:

Msg 22051, Level 16, State 1, Line 0
Attachment file \\EL\Data\Refuse\1.xls is invalid.
20 сен 11, 17:59    [11307880]     Ответить | Цитировать Сообщить модератору
 Re: Перехват ошибки  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
Meriguan
WarAnt
Meriguan,

убрать RAISERROR ('Ошибка отправки письма клиенту',16,1) ?


Если убрать этот блок, то TRY...CATCH не перехватывает ошибку.

К стати сама ошибка:

Msg 22051, Level 16, State 1, Line 0
Attachment file \\EL\Data\Refuse\1.xls is invalid.


ок спрошу по другому:)

IF @err != 0 SELECT 2
чем не устраивает?
20 сен 11, 18:25    [11308020]     Ответить | Цитировать Сообщить модератору
 Re: Перехват ошибки  [new]
Meriguan
Member

Откуда:
Сообщений: 124
WarAnt
Meriguan
пропущено...


Если убрать этот блок, то TRY...CATCH не перехватывает ошибку.

К стати сама ошибка:

Msg 22051, Level 16, State 1, Line 0
Attachment file \\EL\Data\Refuse\1.xls is invalid.


ок спрошу по другому:)

IF @err != 0 SELECT 2
чем не устраивает?


Тем что результат тот же самый, ошибка как была в Messages, так и осталась.

К тому же блок
BEGIN TRY
.......
END TRY
выполняется дальше, а RAISERROR и TRY...CATCH прерывает его дальнейшее выполнение.
20 сен 11, 18:31    [11308068]     Ответить | Цитировать Сообщить модератору
 Re: Перехват ошибки  [new]
ё
Guest
Meriguan
Процедура отправки электронного письма в случае отсутствия вложения по указаному пути возвращает ошибку.

проверить, что файл есть/нет - не вариант ?
20 сен 11, 18:55    [11308208]     Ответить | Цитировать Сообщить модератору
 Re: Перехват ошибки  [new]
Ни разу ни аффтар
Guest
ё
Meriguan
Процедура отправки электронного письма в случае отсутствия вложения по указаному пути возвращает ошибку.

проверить, что файл есть/нет - не вариант ?

Так это не единственно возможная ошибка при отправки письма, для таких целей вроде и придумали try/catch, не?
20 сен 11, 21:27    [11308793]     Ответить | Цитировать Сообщить модератору
 Re: Перехват ошибки  [new]
SamMan
Member

Откуда: Moscow
Сообщений: 759
Meriguan
Тем что результат тот же самый, ошибка как была в Messages, так и осталась.


Никак не могу врубиться - что вы понимаете под Messages? Физическое e-письмо?
21 сен 11, 11:40    [11310352]     Ответить | Цитировать Сообщить модератору
 Re: Перехват ошибки  [new]
Meriguan
Member

Откуда:
Сообщений: 124
SamMan
Meriguan
Тем что результат тот же самый, ошибка как была в Messages, так и осталась.


Никак не могу врубиться - что вы понимаете под Messages? Физическое e-письмо?


Сообщение о результате выполнения запроса.
21 сен 11, 11:50    [11310449]     Ответить | Цитировать Сообщить модератору
 Re: Перехват ошибки  [new]
Meriguan
Member

Откуда:
Сообщений: 124
ё
Meriguan
Процедура отправки электронного письма в случае отсутствия вложения по указаному пути возвращает ошибку.

проверить, что файл есть/нет - не вариант ?


Не вариант, не исключает ошибки при открытом файле.
21 сен 11, 11:55    [11310500]     Ответить | Цитировать Сообщить модератору
 Re: Перехват ошибки  [new]
SamMan
Member

Откуда: Moscow
Сообщений: 759
Meriguan
Сообщение о результате выполнения запроса.


А! Ну тогда в предложении

Meriguan
Если убрать этот блок, то TRY...CATCH не перехватывает ошибку.


вы, мягко говоря, не правы. Приведите полный запускабельный скрипт показывающий пример такого "не перехвата" при работе с хр. проц. sp_send_dbmail.
21 сен 11, 12:20    [11310781]     Ответить | Цитировать Сообщить модератору
 Re: Перехват ошибки  [new]
Meriguan
Member

Откуда:
Сообщений: 124
SamMan
Meriguan
Сообщение о результате выполнения запроса.


А! Ну тогда в предложении


Не понял....

SamMan
Meriguan
Если убрать этот блок, то TRY...CATCH не перехватывает ошибку.


вы, мягко говоря, не правы. Приведите полный запускабельный скрипт показывающий пример такого "не перехвата" при работе с хр. проц. sp_send_dbmail.


После выполнения получаем ошибку, хотя должен быть результат "2", без ошибки(файла по указаному пути нет).

BEGIN TRY
DECLARE @err int

EXEC @err = msdb.dbo.sp_send_dbmail
@profile_name = 'El_Info',
@recipients = 'irog12005@mail.ru',
@subject = 'TEST',
@file_attachments = '\\EL\Data\Refuse\1.xls'
END TRY
BEGIN CATCH
SELECT 2
END CATCH
21 сен 11, 12:31    [11310900]     Ответить | Цитировать Сообщить модератору
 Re: Перехват ошибки  [new]
invm
Member

Откуда: Москва
Сообщений: 9824
Meriguan, результат select @@version в студию. Ибо, например у меня, ваш скрипт отрабатывает вполне корректно.
21 сен 11, 12:52    [11311126]     Ответить | Цитировать Сообщить модератору
 Re: Перехват ошибки  [new]
Meriguan
Member

Откуда:
Сообщений: 124
invm
Meriguan, результат select @@version в студию. Ибо, например у меня, ваш скрипт отрабатывает вполне корректно.


Microsoft SQL Server 2008 (SP2) - 10.0.4000.0 (X64) Sep 16 2010 19:43:16 Copyright (c) 1988-2008 Microsoft Corporation Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)
21 сен 11, 12:58    [11311177]     Ответить | Цитировать Сообщить модератору
 Re: Перехват ошибки  [new]
Meriguan
Member

Откуда:
Сообщений: 124
Тоже самое на:
Microsoft SQL Server 2005 - 9.00.3233.00 (Intel X86) Mar 6 2008 22:09:47 Copyright (c) 1988-2005 Microsoft Corporation Enterprise Edition on Windows NT 5.2 (Build 3790: Service Pack 2)
21 сен 11, 13:01    [11311210]     Ответить | Цитировать Сообщить модератору
 Re: Перехват ошибки  [new]
invm
Member

Откуда: Москва
Сообщений: 9824
invm
Meriguan, результат select @@version в студию. Ибо, например у меня, ваш скрипт отрабатывает вполне корректно.

Вру. Не отрабатывает.
Ошибку выдает ESP xp_sysmail_attachment_load и она не перехватывается. Что еще раз подтверждает -- обработка исключений в SQL Server приделана костылеобразно сбоку...
21 сен 11, 13:05    [11311260]     Ответить | Цитировать Сообщить модератору
 Re: Перехват ошибки  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
отрабатывает, получаю таблицу с двойкой
Microsoft SQL Server 2008 (SP2) - 10.0.4321.0 (Intel X86)
21 сен 11, 13:12    [11311342]     Ответить | Цитировать Сообщить модератору
 Re: Перехват ошибки  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
хотя не, тоже вру ) забыл имя профиля на существующий исправить
Msg 22051, Level 16, State 1, Line 0
Attachment file \\EL\Data\Refuse\1.xls is invalid.
21 сен 11, 13:20    [11311461]     Ответить | Цитировать Сообщить модератору
 Re: Перехват ошибки  [new]
SamMan
Member

Откуда: Moscow
Сообщений: 759
Meriguan
После выполнения получаем ошибку, хотя должен быть результат "2", без ошибки(файла по указаному пути нет).


Да, так согласен: если ошибка в самом sp_send_dbmail (например - указан не сущ. профиль) - все OK, имеем 2. Если отработка пошла "глубже" и sp_send_dbmail стал дергать зависимые функции - кирдык, TRY/CATCH в пролете. Можно открывать баг на Микрософте.
Какой ворк-эраунд прямо сейчас? Ну... например - создавать темповую копию запрошенного файла и аттачить уже ее. Неудача создания такой копии заодно покажет отсутствие необходимости в отправке почты. Криво и некрасиво, но обходные маневры они такие...
21 сен 11, 18:13    [11314524]     Ответить | Цитировать Сообщить модератору
 Re: Перехват ошибки  [new]
invm
Member

Откуда: Москва
Сообщений: 9824
SamMan, зачем так сложно? Как и предлагал г-н ё, надо всего лишь самостоятельно проверить наличие файла:
declare @t table (f varchar(max));

insert into @t
exec xp_cmdshell 'dir \\SomeServer\SomeShare\SomeFile.txt /b';

if exists(select * from @t where f = 'SomeFile.txt')
 select 'Exists';
else
 select 'Not Exists';
21 сен 11, 19:24    [11315032]     Ответить | Цитировать Сообщить модератору
 Re: Перехват ошибки  [new]
Meriguan
Member

Откуда:
Сообщений: 124
invm
SamMan, зачем так сложно? Как и предлагал г-н ё, надо всего лишь самостоятельно проверить наличие файла:
declare @t table (f varchar(max));

insert into @t
exec xp_cmdshell 'dir \\SomeServer\SomeShare\SomeFile.txt /b';

if exists(select * from @t where f = 'SomeFile.txt')
 select 'Exists';
else
 select 'Not Exists';


Данный скрипт только на проверку наличия файла. Будет другая ошибка(пример: файл открыт), результате будет тот же самое.
22 сен 11, 10:07    [11316882]     Ответить | Цитировать Сообщить модератору
 Re: Перехват ошибки  [new]
Meriguan
Member

Откуда:
Сообщений: 124
SamMan
Ну... например - создавать темповую копию запрошенного файла и аттачить уже ее. Неудача создания такой копии заодно покажет отсутствие необходимости в отправке почты. Криво и некрасиво, но обходные маневры они такие...


В принципе, такой вариант подходит...
22 сен 11, 10:23    [11316982]     Ответить | Цитировать Сообщить модератору
 Re: Перехват ошибки  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
Meriguan
invm
SamMan, зачем так сложно? Как и предлагал г-н ё, надо всего лишь самостоятельно проверить наличие файла:
declare @t table (f varchar(max));

insert into @t
exec xp_cmdshell 'dir \\SomeServer\SomeShare\SomeFile.txt /b';

if exists(select * from @t where f = 'SomeFile.txt')
 select 'Exists';
else
 select 'Not Exists';


Данный скрипт только на проверку наличия файла. Будет другая ошибка(пример: файл открыт), результате будет тот же самое.

ну дак поставьте все проверки какие придумаете:)
22 сен 11, 10:30    [11317023]     Ответить | Цитировать Сообщить модератору
 Re: Перехват ошибки  [new]
Vicont_rtf
Member

Откуда:
Сообщений: 64
попробуй в конце return написать
22 сен 11, 10:33    [11317044]     Ответить | Цитировать Сообщить модератору
 Re: Перехват ошибки  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
SamMan
Если отработка пошла "глубже" и sp_send_dbmail стал дергать зависимые функции - кирдык, TRY/CATCH в пролете. Можно открывать баг на Микрософте.
Там используется Extended Stored Procedures (sys.xp_sysmail_attachment_load)
А разве ошибки от них ловились в TRY?
И номер ошибки отсутствует в sys.messages (master, msdb).
22 сен 11, 11:17    [11317464]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить