Bug in Mixed Compilation Modus in Oracle11.2

Vor einiger Zeit bin ich auf ein seltsames Verhalten in Oracle 11.2.03 gestoßen. Wenn der Code entweder Native oder Interpreted kompiliert ist, läuft alles super. Doch mischt man die beiden, so kommt es vor, dass die Exceptions verschluckt werden.
Da ich in Oracle auch OO Programmiere habe ich ein Beispiel mit den Object Types konstruiert um das Problem nachzustellen.
Folgende ausgangssituation:
Ich habe Zwei Object Types. Der eine erbt von dem anderen.

-- Object Type 1
CREATE OR REPLACE TYPE TYPE1 force AS OBJECT
(
id NUMBER
,constructor FUNCTION TYPE1 RETURN SELF AS RESULT
,constructor FUNCTION TYPE1(IN_ID IN NUMBER) RETURN SELF AS RESULT
) NOT final;
/
CREATE OR REPLACE
TYPE BODY TYPE1 AS

  constructor FUNCTION TYPE1 RETURN SELF AS RESULT AS
  BEGIN
    /* TODO Implementierung erforderlich */
    RETURN ;
  END TYPE1;

  constructor FUNCTION TYPE1(IN_ID IN NUMBER) RETURN SELF AS RESULT AS
  BEGIN
    /* TODO Implementierung erforderlich */
    SELF.ID := IN_ID;
    RETURN ;
  exception
    WHEN others THEN
      dbms_output.put_line('Fehler!');
  END TYPE1;

END;
/

--Object Type 2
CREATE OR REPLACE TYPE TYPE2 force UNDER TYPE1
(
name varchar2(3)
,constructor FUNCTION TYPE2 RETURN SELF AS RESULT
,constructor FUNCTION TYPE2(in_name IN varchar2) RETURN SELF AS RESULT
) NOT final
/
CREATE OR REPLACE
TYPE BODY TYPE2 AS

  constructor FUNCTION TYPE2 RETURN SELF AS RESULT AS
  BEGIN
    /* TODO Implementierung erforderlich */
    RETURN ;
  END TYPE2;

  constructor FUNCTION TYPE2(in_name IN varchar2) RETURN SELF AS RESULT AS
  BEGIN
    /* TODO Implementierung erforderlich */
   
    SELF.NAME := in_name;
   
    RETURN ;
  exception
    WHEN others THEN
      dbms_output.put_line('Fehler!');
  END TYPE2;

END;
/

Im ersten Fall, wenn der Code in einem bestimmten Typ kompiliert ist, funktioniert alles wunderbar. Wir kompilieren als Native und instanzieern dann ein Object mit einem falschem Wert.

ALTER TYPE TYPE1 compile specification PLSQL_CODE_TYPE = NATIVE;
ALTER TYPE TYPE1 compile body PLSQL_CODE_TYPE = NATIVE;
ALTER TYPE TYPE2 compile specification PLSQL_CODE_TYPE = NATIVE;
ALTER TYPE TYPE2 compile body PLSQL_CODE_TYPE = NATIVE;
SET serveroutput ON;
DECLARE
  t type2;
BEGIN

  dbms_output.put_line('Start Test1');
  t := type2(in_name=>'ABCD');
  dbms_output.put_line('End Test1');
exception
 WHEN others THEN
   dbms_output.put_line('Error Test1');
END;
/

In diesem Fall verhält sich das System wie erwartet und man bekommt folgende Ausgabe.

Start Test1
Fehler!
Error Test1

Das Programm bricht also ab und die Zeile End Test1 wird nicht ausgegeben.
Wenn der Code in gemixter Form kompiliert wird, so verhält sich dieser Komplet anderes.

alter type TYPE1 compile specification PLSQL_CODE_TYPE = INTERPRETED;
alter type TYPE1 compile body PLSQL_CODE_TYPE = INTERPRETED;
alter type TYPE2 compile specification PLSQL_CODE_TYPE = INTERPRETED;
alter type TYPE2 compile body PLSQL_CODE_TYPE = NATIVE;
set serveroutput on;
declare
  t type2;
begin

  dbms_output.put_line('Start Test2');
  t := type2(in_name=>'A');
  dbms_output.put_line('End Test2');
exception
 when others then
   dbms_output.put_line('Error Test2');
end;
/

In diesem Fall bekommt man eine erfolgreiche Ausführung des Codes:

Start Test2
End Test2

Das ganze wurde von mir auf Oracle 11.2.03 getestet und für unschön befunden.
Fazit: Wenn man auf Native umsteigt, muss man vorsichtig sein, dass auch alles in native kompiliert wird, sonst besteht die Gefahr etwas wichtiges zu übersehen.