Обработка исключений PL / SQL в процедурах - PullRequest
1 голос
/ 09 сентября 2011

Это своего рода вопрос о лучших практиках.У меня есть блок PL / SQL, подобный этому

DECLARE

    --work variables

    PROCEDURE p1(in_parameter1, out_parameter1, out_parameter2...) IS
    BEGIN    
        --do stuff
        --select ( ... ) into ( ... ) from t1 where ( ... )
    END;

    PROCEDURE p2(in_parameter1, out_parameter1, out_parameter2...) IS
    BEGIN 
        --do stuff
        --insert/update tables
        --do more stuff
    END;    

BEGIN -- MAIN PROCESS STARTS HERE

    open c1;
    fetch c1 into c1RowData;
    EXIT WHEN c1%NOTFOUND    
     --call procedure1
     --do stuff
     --call procedure2
     --do stuff
     --do stuff
     --call procedure1
     --call procedure2
END;
/
EXIT;

Операторы в процедурах p1 и p2 могут вызывать исключения (NO_DATA_FOUND, DUP_VAL_ON_INDEX, ...).

Что вы думаетелучший способ справиться с этими исключениями?Должны ли они обрабатываться внутри процедур или вы думаете, что я должен окружать каждый вызов процедур в основном корпусе блоком TRY-CATCH?

Ответы [ 3 ]

6 голосов
/ 09 сентября 2011

Лично я бы поймал их в процедурах, из которых они выброшены.Это означает, что у вас гораздо больше контроля над тем, как они обрабатываются извне.Например, вы можете выбросить их снова как определенные пользователем исключения, которые вы можете украсить дополнительной информацией о том, что именно пошло не так.

'Failed to find a matching row in table a for value b'

гораздо более информативно вне процедуры, чем

'no data found'

Но это действительно зависит от:

  1. Требования к сообщениям об ошибках вызывающего приложения
  2. Реальная функциональность, реализованная в тех случаях, когда вы «делаете вещи» в процедурах

Например, допустим, что вы хотели запустить процедуру 2, даже если выбор в процедуре 1 не нашел строк ..Вам нужно поймать исключение в процедуре 1 и игнорировать его.Если вы этого не сделали, то он будет передан обработчику исключений в процедуре 2.

Или, скажем, вы хотите, чтобы процедура 1 вставляла строку в случае, когда выборка ничего не нашла, вВ этом случае вам нужно перехватить исключение и выполнить вставку в обработчике исключений.

Теперь, прежде чем кто-нибудь прыгнет на меня, я не рекомендую вам использовать обработчики исключений для управления потоком выполнения в вашем коде, эти примеры являются теоретическими, но, надеюсь, вы поняли идею.

3 голосов
/ 09 сентября 2011

Вы должны попытаться обработать исключения в источнике (то есть в рамках процедуры, которая их вызывает).Это дает вам больше возможностей для сообщения о том, где возникла проблема, и, как правило, больше шансов на то, чтобы изящно исправить проблему, не передавая неприятное сообщение об ошибке Oracle по стеку пользователю.

Конечно, вы можетеи обрабатывать ошибку, и повторно вызывать ее, если вам действительно нужно, но, как ответил StevieG, вы также можете вызывать определенные пользователем исключения, которые, как правило, более специфичны для приложения и более полезны для ваших пользователей / другого кода PL / SQL.

Здесь обсуждается ASKTOM по пользовательской обработке ошибок: http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:4684561825338

1 голос
/ 09 сентября 2011

Лучше всего, когда исключения обрабатываются внутри процедуры. Это будет быстро. Мало того, что если мы повторно используем ту же процедуру в некоторых других функциях, нам также не нужно обрабатывать исключения. С моей точки зрения, исключения, которые могут обрабатываться внутри самой процедуры, являются лучшими.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...