Можно ли создавать определенные пользователем исключения и иметь возможность изменять SQLERRM?
Например:
DECLARE
ex_custom EXCEPTION;
BEGIN
RAISE ex_custom;
EXCEPTION
WHEN ex_custom THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;
/
Вывод «Исключение, определяемое пользователем». Можно ли изменить это сообщение?
РЕДАКТИРОВАТЬ: Вот еще некоторые детали.
Надеюсь, это иллюстрирует то, что я пытаюсь сделать лучше.
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;
/
На самом деле таких субблоков десятки. Мне интересно, есть ли способ создать отдельное пользовательское исключение для каждого из этих подблоков, но оно должно выдавать другое сообщение вместо создания отдельного пользовательского исключения для каждого подблока.
В .NET это было бы как пользовательское исключение, подобное этому:
public class ColorException : Exception
{
public ColorException(string message)
: base(message)
{
}
}
И тогда метод будет выглядеть примерно так:
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!");
}