Можно ли создавать пользовательские исключения и иметь возможность изменять 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!");
}