17)错误处理

Posted xuan01

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了17)错误处理相关的知识,希望对你有一定的参考价值。

declare关键字:

自定义错误处理程序时,需使用declare关键字,格式如下:

declare 错误处理类型 handler for 错误触发条件 自定义错误处理程序;

其中,错误处理类型:continue exit;

错误触发条件:预定义、MySQL错误代码、自定义错误触发条件、ANSI标准错误代码 

自定义错误处理程序位置: 变量、游标声明之后,但是在语句执行之前;

 

1)采用预定义的触发条件:

该触发包括:sqlwarning、sqlexception、not found;

设计一个输出给定学号的姓名;没有学号的输出 ‘没有学号为      的学生’;

delimiter $$
create procedure get_name_proc(in stu_no char(11), out stu_name char(10))
begin
    declare exit handler for not found
     begin
      select concat(\'没有学号为\',stu_no,\'的学生 \') error;
     end;
    select student_name into stu_name from student where student_no=stu_no;
end;
$$
delimiter ;

测试:可以看到对于没有学号的,输出符合预期;

set @stu_name = \'\';
call get_name_proc(\'2023001\',@stu_name); 
select @stu_name;
call get_name_proc(
\'2023009\',@stu_name);

 

2)使用MySQL错误处理代码

我们向课程表 执行一条插入失败命令;注意,此前我们的 teacher_no 已经是unique约束的;

唯一约束的  MySQL错误处理代码是1062;23000是对应的ANSI编号;

我们可以设计一个向课程表中插入新项 的过程,但是该项中的教师 已经开设了一门课,提示错误;

delimiter $$
create procedure insert_course_proc(in c_name char(10),in cnt int,in des varchar(100),in tea_no char(10))
begin
    declare exit handler for 1062
    begin
     select \'该教师已经提交了一门选修课!\' error;
    end;
    insert into course(course_name,up_limit,description,teacher_no) values(c_name,cnt,des,tea_no);
end;
$$
delimiter ;

测试:

call insert_course_proc(\'java\',150,\'暂无\',\'001\');

 

 3)使用ANSI标准错误代码 

还是使用上面的例子,只是替换了一句declare:

declare exit handler for 1062
#将上面这句替换为下面
declare exit handler for sqlstate \'23000\'

 

 

4)自定义错误触发条件

语法为:

declare 错误触发条件 condition for 错误代码;

还是上面例子,替换为:

declare exit handler for 1062
#将上面这句替换为下面:
declare unique_error condition for 1062;
declare exit handler for unique_error

 

5)捕获多个错误处理程序

那么是否可以一个存储过程处理多个错误程序呢?当然可以;比如这个例子,teacher_no 不仅可能会违反唯一约束,还有可能违反外键约束;

 可以看出违反外键约束 的MySQL错误处理代码是 1452;

由此,我们设计一个 违反外键约束和唯一约束 的错误处理过程:

delimiter $$
create procedure insert_course4_proc(in c_name char(10),in cnt int,in des varchar(100),in tea_no char(10))
begin
    declare exit handler for 1452
     select \'该教师不存在!\' error;
    declare exit handler for 1062
    begin
     select \'该教师已经提交了一门选修课!\' error;
    end;
    insert into course(course_name,up_limit,description,teacher_no) values(c_name,cnt,des,tea_no);
end;
$$
delimiter ;

#测试
call insert_course4_proc(\'java\',150,\'暂无\',\'009\');
call insert_course4_proc(\'java\',150,\'暂无\',\'001\');

 

liteos错误处理

1. 概述

1.1 基本概念

错误处理指用户代码发生错误时,系统调用错误处理模块的接口函数,完成上报错误信息,并调用用户自己的钩子函数,进行特定的处理。

错误处理模块实现OS内部错误码记录功能。OS内部错误码无法通过接口返回,通常会上报错误处理模块进行记录。用户可以通过挂接错误处理的钩子函数,进行特定的处理。如果OS上报的错误是致命错误,系统会进行异常流程接管,从而可以保存现场以便定位问题。

通过错误处理,我们可以把用户在程序中的非法输入进行控制和提示,以防程序崩
溃。

1.2 运作机制

错误处理是一种机制,用于处理异常状况。通过错误处理,我们可以将用户在程序中的非法输入进行控制和提示,以防程序崩溃。当程序出现异常错误的时候,会显示相应的错误码用于提示用户。此外,如果有相应的错误处理程序,则会执行这个程序,以防程序崩溃。

技术图片

2. 开发指导

2.1 功能

错误处理模块为用户提供下面几种功能。

功能分类 接口名 描述
错误处理 LOS_ErrHandle 根据错误处理函数来对错误进行处理

3. 编程实例

3.1 实例

在下面的例子中,演示如下功能:

  1. 执行错误处理函数

3.2 编程实例

代码实现如下:

extern USER_ERR_FUNC_S g_stUserErrFunc;
void *err_handler(CHAR *pcFileName,UINT32 uwLineNo,
UINT32 uwErrorNo,UINT32 uwParaLen,VOID *pPara)

 printf("err handel ok\\n");

UINT32 Example_ErrCaseEntry(VOID)

 /*执行错误处理函数*/
 LOS_ErrHandle(NULL, 0,0,0, NULL);
 return LOS_OK;

3.3 结果

编译运行得到的结果

技术图片

以上是关于17)错误处理的主要内容,如果未能解决你的问题,请参考以下文章

javascript权威指南第17章 错误异常处理

HTTP 错误 404.17 - Not Found 请求的内容似乎是脚本,因而将无法由静态文件处理程序来处理。

WCF HTTP 错误 404.17 - 未找到 请求的内容似乎是脚本,不会由静态文件处理程序提供

HTTP 错误 404.17 - Not Found 请求的内容似乎是脚本,因而将无法由静态文件处理程序来处理

IIS7出现“HTTP 错误 404.17 - Not Found 请求的内容似乎是脚本,因而将无法由静态文件处理程序来处理。”错误-Windows-

Ubuntu17.04安装WPS:在处理时有错误发生