Ist es möglich, benutzerdefinierte Ausnahmen zu erstellen und das SQLERRM zu ändern?
Zum Beispiel:
DECLARE
ex_custom EXCEPTION;
BEGIN
RAISE ex_custom;
EXCEPTION
WHEN ex_custom THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;
/
Die Ausgabe lautet "Benutzerdefinierte Ausnahme". Ist es möglich, diese Nachricht zu ändern?
EDIT: Hier sind einige Details.
Ich hoffe, dieser zeigt, was ich besser machen will.
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;
/
In Wirklichkeit gibt es Dutzende dieser Unterblöcke. Ich frage mich, ob es eine Möglichkeit gibt, eine einzelne benutzerdefinierte Ausnahme für jeden dieser Unterblöcke auszulösen, aber eine andere Meldung zu geben, anstatt für jeden Unterblock eine separate benutzerdefinierte Ausnahme zu erstellen.
In .NET wäre es so, als hätte man eine benutzerdefinierte Ausnahme wie diese:
public class ColorException : Exception
{
public ColorException(string message)
: base(message)
{
}
}
Und dann hätte eine Methode ungefähr so:
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!");
}