2013-11-26 29 views
5
DECLARE 
    string_of_5_chars VARCHAR2(5); 
BEGIN 
    BEGIN 
     string_of_5_chars := 'Steven'; 
    EXCEPTION 
     WHEN value_error THEN 
      RAISE no_data_found; 
     WHEN no_data_found THEN 
      dbms_output.Put_line ('Inner block'); 
    END; 
EXCEPTION 
    WHEN no_data_found THEN 
     dbms_output.Put_line ('Outer block'); 
END; 

答えは、「Outer block」と表示されます。なぜ内部ブロックが実行されないのかを誰かが説明できますか?ネストされた例外ブロックの詳細については、OracleのOracleのネストされたブロックと例外処理

+0

は、Oracle Express EditionのとSQL開発(両方とも無料)およびPL/SQLのこのブロックの実行をデバッグをダウンロードしてみていましたか? –

答えて

8
DECLARE 
string_of_5_chars VARCHAR2(5); 
BEGIN 
BEGIN 
    string_of_5_chars := 'Steven'; // Varchar has a size of 5 defined above. So it will throw a value_error(due to size constraints) exception. 
EXCEPTION 
    WHEN value_error THEN // This exception block will handle the error thrown above. 
     RAISE no_data_found; // It raises a no_data _found exception which by rule has to be handled in the outer exception block. So it goes to the outer exception block. 
    WHEN no_data_found THEN 
     dbms_output.Put_line ('Inner block'); 
END; 
EXCEPTION 
WHEN no_data_found THEN 
    dbms_output.Put_line ('Outer block'); // Exception is handled here which causes it to print 'Outer Block' 
END; 

読むhereで例外の優先順位はどのようなものです。

0

string_of_5_chars := 'Steven';value_errorになると、対応する例外ブロックが入力されます。
例外ブロック内では、no_data_found例外が発生します。引き上げ部分のために、この例外は外部ブロックの例外処理によって処理されます。詳細については

はあなたが定期的CASE文と類似していると例外ブロックのWHEN句を検討すべきであるhttp://docs.oracle.com/cd/B19306_01/appdev.102/b14261/raise_statement.htm

2

をご確認ください。条件に一致する最初のWHENが実行され、その例外ハンドラ内の次のWHEN句がスキップされます。

したがって、内部例外ブロックの2番目のWHEN句はコード実行パスにまったくなく、外側例外ブロックは入れ子になった例外の最初のWHEN句によって生成されたno_data_foundエラーをキャッチします。このシナリオでは

例外の伝播がここで説明されていますhttp://docs.oracle.com/cd/B28359_01/appdev.111/b28370/errors.htm#LNPLS00706

関連する問題