Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / обработка экцепшенов с помощью when ... do / 9 сообщений из 9, страница 1 из 1
10.01.2014, 17:53:45
    #38522345
SEYD
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
обработка экцепшенов с помощью when ... do
Добрый вечер,

есть вот такая ХП:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
SET TERM ^ ;

create or alter procedure JOURNAL_USERINFO_PARAM_CAST (
    PARAM_VALUE varchar(256),
    TYPECAST smallint)
returns (
    PARAM_VALUE_CASTED varchar(256))
as
declare variable VALUE_INT bigint;
declare variable VALUE_FLOAT double precision;
declare variable VALUE_CHAR varchar(256);
begin
  begin
    if (typecast in (0, 3, 4, 5)) then value_int = cast(param_value as bigint);
    else if (typecast in (1, 6, 7, 8)) then value_float = cast(param_value as double precision);
    else value_char = param_value;

    select
      case :typecast
        when 0 then :value_int
        --при отображении чисел float убираем в конце лишние ноли, но оставляем минимум 2 знака после запятой (типа копейки)
        when 1 then iif(position('.',trim(trailing '0' from :value_float))>char_length(trim(trailing '0' from :value_float))-3, rpad(trim(trailing '0' from :value_float),2+position('.',trim(trailing '0' from :value_float)),'0'),trim(trailing '0' from :value_float))
        when 2 then :value_char
        when 3 then :value_int
        when 4 then :value_int
        when 5 then iif(:value_int=0, 'Изначально', cast('30.12.1899' as date)+:value_int)
        when 6 then iif(:value_float=0, 'Изначально', cast('30.12.1899 0:00' as timestamp)+:value_float)
        when 7 then iif(:value_float*24>10, cast(trunc(:value_float*24, 0) as integer), lpad(cast(trunc(:value_float*24, 0) as integer), 2, '0')) || ':' || lpad(mod(trunc(:value_float*24*60, 0), 60), 2,'0') || ':' || lpad(mod(trunc(:value_float*24*60*60, 0), 60), 2, '0')
        when 8 then iif(:value_float>10, cast(trunc(:value_float, 0) as integer), lpad(cast(trunc(:value_float, 0) as integer), 2, '0')) || ':' || lpad(mod(trunc(:value_float*60, 0), 60), 2,'0') || ':' || lpad(mod(trunc(:value_float*60*60, 0), 60), 2, '0')
      end
      from rdb$database
      into :param_value_casted;

    when sqlcode -413 do param_value_casted = '[value cast: conversion error] sqlcode='||sqlcode;
    when sqlcode -802 do param_value_casted = '[value cast: string truncation error] sqlcode='||sqlcode;
    when any do param_value_casted = '[value cast: unknown error] sqlcode='||sqlcode;
  end

  suspend;
end^

SET TERM ; ^



ести в качестве параметров передать:
PARAM_VALUE: Любой текст
TYPECAST: 0

то будет экцепшн "conversion error from string" с sqlcode=-413, но срабатывает when any и говорит, что sqlcode=0. При этом если when any закомментить, то срабатывает when sqlcode -413 c соответствующим сообщением.

что не так? почему when any повторно реагирует на экцепшн?
...
Рейтинг: 0 / 0
10.01.2014, 18:12:54
    #38522376
dimitr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
обработка экцепшенов с помощью when ... do
SEYDпочему when any повторно реагирует на экцепшн?
а где-то написано, что не должен? Тынц
...
Рейтинг: 0 / 0
10.01.2014, 18:24:18
    #38522384
SEYD
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
обработка экцепшенов с помощью when ... do
dimitrа где-то написано, что не должен?

как мне кажется это не логично...

ок, тогда почему при втором срабатывании sqlcode равен 0, а не -413? Какой в этом кроется смысл?
...
Рейтинг: 0 / 0
10.01.2014, 18:41:55
    #38522404
dimitr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
обработка экцепшенов с помощью when ... do
SEYDкак мне кажется это не логично...
не буду спорить, но такова данность

SEYDтогда почему при втором срабатывании sqlcode равен 0, а не -413?
не знаю, может и баг
...
Рейтинг: 0 / 0
13.01.2014, 09:48:13
    #38523885
SEYD
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
обработка экцепшенов с помощью when ... do
SEYDок, тогда почему при втором срабатывании sqlcode равен 0, а не -413? Какой в этом кроется смысл?

ну так что, кто знает ответ и как сделать правильно?
...
Рейтинг: 0 / 0
13.01.2014, 10:07:16
    #38523901
SEYD
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
обработка экцепшенов с помощью when ... do
кстати, если вдруг: fb 2.5.2.26540 32-bit
...
Рейтинг: 0 / 0
13.01.2014, 12:57:37
    #38524198
Dmitry Kurbsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
обработка экцепшенов с помощью when ... do
Например,
Код: sql
1.
2.
3.
4.
5.
6.
when того
  begin
    сего;
    suspend;
    exit;
  end
...
Рейтинг: 0 / 0
13.01.2014, 13:38:42
    #38524274
SEYD
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
обработка экцепшенов с помощью when ... do
Dmitry Kurbsky,
это понятно, меня больше интересует:

SEYDтогда почему при втором срабатывании sqlcode равен 0, а не -413? Какой в этом кроется смысл?
...
Рейтинг: 0 / 0
13.01.2014, 14:21:33
    #38524361
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
обработка экцепшенов с помощью when ... do
SEYD,

спроси у борланда
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / обработка экцепшенов с помощью when ... do / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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