Est-il possible de créer des exceptions définies par l'utilisateur et de pouvoir modifier le SQLERRM ?
Par exemple :
DECLARE
ex_custom EXCEPTION;
BEGIN
RAISE ex_custom;
EXCEPTION
WHEN ex_custom THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;
/
Le résultat est "User-Defined Exception". Est-il possible de modifier ce message ?
EDIT : Voici quelques détails supplémentaires.
J'espère que celle-ci illustre mieux ce que j'essaie de faire.
DECLARE
l_table_status VARCHAR2(8);
l_index_status VARCHAR2(8);
l_table_name VARCHAR2(30) := 'TEST';
l_index_name VARCHAR2(30) := 'IDX_TEST';
ex_no_metadata EXCEPTION;
BEGIN
BEGIN
SELECT STATUS
INTO l_table_status
FROM USER_TABLES
WHERE TABLE_NAME = l_table_name;
EXCEPTION
WHEN NO_DATA_FOUND THEN
-- raise exception here with message saying
-- "Table metadata does not exist."
RAISE ex_no_metadata;
END;
BEGIN
SELECT STATUS
INTO l_index_status
FROM USER_INDEXES
WHERE INDEX_NAME = l_index_name;
EXCEPTION
WHEN NO_DATA_FOUND THEN
-- raise exception here with message saying
-- "Index metadata does not exist."
RAISE ex_no_metadata;
END;
EXCEPTION
WHEN ex_no_metadata THEN
DBMS_OUTPUT.PUT_LINE('Exception will be handled by handle_no_metadata_exception(SQLERRM) procedure here.');
DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;
/
En réalité, il y a des dizaines de ces sous-blocs. Je me demande s'il n'y a pas un moyen d'avoir une seule exception définie par l'utilisateur pour chacun de ces sous-blocs à lever, mais en donnant un message différent, au lieu de créer une exception définie par l'utilisateur distincte pour chaque sous-bloc.
En .NET, ce serait un peu comme avoir une exception personnalisée comme celle-ci :
public class ColorException : Exception
{
public ColorException(string message)
: base(message)
{
}
}
Et ensuite, une méthode aurait quelque chose comme ça :
if (isRed)
{
throw new ColorException("Red is not allowed!");
}
if (isBlack)
{
throw new ColorException("Black is not allowed!");
}
if (isBlue)
{
throw new ColorException("Blue is not allowed!");
}