如何捕获从oracle到java的自定义引发的异常

如何捕获从oracle到java的自定义引发的异常,java,reactjs,oracle,exception,error-handling,Java,Reactjs,Oracle,Exception,Error Handling,我有一个oracle db,它在表上有一个触发器。如果满足某些条件,则会在删除时引发自定义异常。在Java中,我在DAO层中使用NamedParameterJdbcTemplate。结构是经典的控制器服务dao。如何在Java中捕获此异常的文本?提前谢谢。 这是我的扳机 create or replace TRIGGER "ME"."EDITABLE_SETTINGS_DELETE" BEFORE DELETE ON "ME".&qu

我有一个oracle db,它在表上有一个触发器。如果满足某些条件,则会在删除时引发自定义异常。在Java中,我在DAO层中使用NamedParameterJdbcTemplate。结构是经典的控制器服务dao。如何在Java中捕获此异常的文本?提前谢谢。 这是我的扳机

create or replace TRIGGER "ME"."EDITABLE_SETTINGS_DELETE" 
BEFORE DELETE ON "ME"."MAP_SETTINGS"
FOR EACH ROW
ENABLE
DECLARE
PRAGMA AUTONOMOUS_TRANSACTION;
CURSOR is_editable_cursor IS
select is_editable
from map_calculation mc 
inner join map_calculation_group mg on mc.id_calc = mg.id_calc
where mg.id_calc = mc.id_calc and mg.id_settings = :old.id_settings;
TYPE is_editable_table IS TABLE OF VARCHAR2(1 CHAR);
v_is_editable is_editable_table;
BEGIN
OPEN is_editable_cursor;
FETCH is_editable_cursor BULK COLLECT INTO v_is_editable;
CLOSE is_editable_cursor;
IF ('F' MEMBER OF v_is_editable) THEN
    RAISE_APPLICATION_ERROR( -20017, 'You cannot delete settings inn an uneditable calculation' );
END IF;
COMMIT;
END;
这是道

@Override
    public void delete(Integer id) {
        SqlParameterSource parameters = new MapSqlParameterSource().addValue("ID_SETTINGS", id);
        try {
            namedParameterJdbcTemplate.update(DELETE_SQL, parameters);
        } catch (Exception e) {
            log.error(e.getMessage());
            throw new RuntimeException("Error during deletion: " + e.getMessage());
        }
    }
这是前面的按钮

                        <Button
                            variant='primary'
                            onClick={() => {
                                globalProps
                                    .deleteItem()
                                    .then(() => {
                                        table.draw();
                                    })
                                    .catch((e) => {
                                        console.log(e);
                                        this.setState({ error: e.message });
                                        this.setState({ showModalBatch: true });
                                    });
                                this.props.toggleShowDelete();
                            }}
                        >
                            Удалить
                        </Button>
{
环球酒店
.deleteItem()
.然后(()=>{
table.draw();
})
.catch((e)=>{
控制台日志(e);
this.setState({error:e.message});
this.setState({showModalBatch:true});
});
this.props.toggleShowDelete();
}}
>
Удалить

我有一个显示消息的模式,它显示的只是“请求失败,状态代码为500”

您能说明如何在数据库中引发异常吗?为什么它与捕获和处理任何其他异常不同?oracle中的自定义引发异常通常使用从-20001到-20999的代码。捕获或处理任何其他异常应该没有什么不同。我将使用一些codeEdited进行编辑,请看一看。您可以演示如何在数据库中引发异常吗?为什么它与捕获和处理任何其他异常不同?oracle中的自定义引发异常通常使用-20001到-20999的代码。捕获或处理任何其他异常应该没有什么不同。我将使用一些codeEdited进行编辑,请看一看我尝试过这个,但它说我不能使用SQLException,因为try中的语句从不抛出一个。不知怎的,没有这样的根本原因,因为在这种情况下,我根本没有得到任何模态…我尝试过这个,但它说我不能使用SQLException,因为try-never-throw-one中的语句没有这样的根本原因,因为在这种情况下,我根本没有得到任何模态。。。
try {
    ...
} catch (DataAccessException ex) {
    if (ex.getRootCause() instanceof SQLException) {
        SQLException sqlEx = (SQLException) ex.getRootCause();
        int errorCode = sqlEx.getErrorCode();
        if (errorCode == -20017) {
            ...
        }
    }
}