扩展Exception,增加判断Exception是否为SQL引用约束异常方法!

在设计数据表时,如果将某些列设置为关联其它表的外键,那么如果对其进行增加、修改操作时,其关联表若没有相匹配的记录则报错,或者在对其关联表进行删除时,也会报错,这就是外键约束的作用,当然除了外键还有许多约束,在此暂不讨论,本篇文章主要讲的是,如何判断是否为SQL的引用约束异常,从而能够更好的将SQL复杂的报错转换为用户能够明白的友好提示。

扩展Exception,增加判断Exception是否为SQL引用约束异常方法(IsSqlReferenceConstraintException):

public static bool IsSqlReferenceConstraintException(this Exception except)
        {
            var baseEx = except.GetBaseException();
            if (baseEx is SqlException)
            {
                string message = (baseEx as SqlException).Message;
                if (message.ToLower().Contains("reference constraint"))
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            else if (baseEx != null && !object.ReferenceEquals(except, baseEx))//如果基类不为空且不等于异常本身,则继续回调查找
            {
                return IsSqlReferenceConstraintException(baseEx);
            }
            return false;
        }

原生的SQL报错信息如下:

The DELETE statement conflicted with the REFERENCE constraint "FK_dbo.Category_dbo.User_LastEditorID". The conflict occurred in database "mTEM", table "dbo.Category", column ‘LastEditorID‘.
The statement has been terminated.

而采用扩展方法则会显示出我们预定义的错误信息,调用如下:

public void Remove(int userID)
        {
            User user=this.repository.Get(t=>t.ID==userID);
            if (user != null)
            {
                try
                {
                    this.repository.Remove(user, true);
                }
                catch (Exception ex)
                {
                    if (ex.IsSqlReferenceConstraintException()) //判断为引用约束错误,则直接抛出我们自定义的错误
                    {
                        throw new Exception("该账号已有与之相关联的其它业务记录,禁止删除!若确认该账号停止使用,可将其设置为禁用即可。");
                    }
                }
            }
            else
            {
                throw new Exception("该账号信息不存在或已被删除!");
            }
        }
时间: 2024-10-09 00:50:44

扩展Exception,增加判断Exception是否为SQL引用约束异常方法!的相关文章

YII2数据库操作出现类似Database Exception – yii\db\Exception SQLSTATE[HY000] [2002] No such file or director

YII2进行MYSQL数据库操作时出现Database Exception – yii\db\Exception  SQLSTATE[HY000] [2002] No such file or directory错误的解决方法 在进行数据库操作时出现如下类似错误,实际则是PHP配置文件php.ini中未指定mysql.sock(或mysqld.sock)文件路径导致的PDO无法链接数据库 Database Exception – yii\db\Exception SQLSTATE[HY000]

Terminating app due to uncaught exception 'CALayerInvalidGeometry', reason: 'CALayer position contains NaN: [160 nan]解决方法

1 2014-06-11 15:19:17.167 ***[930:707] *** Terminating app due to uncaught exception 'CALayerInvalidGeometry', reason: 'CALayer position contains NaN: [160 nan]' 2 *** Call stack at first throw: 3 ( 4 0 CoreFoundation 0x3365d64f __exceptionPreprocess

checked exception 与 runtime exception

Java存在三种可抛出结构(throwable):受检异常(checked exception).运行时异常(runtime exception)和错误(error).使用原则是: 1.如果期望调用者能够恢复,则应该使用受检异常.抛出受检异常,可以强迫调用者在一个catch子句中处理该异常,或者继续向外传播. 2.运行时异常是指难以恢复或者不可恢复的程序错误.大多数运行时异常都是表明前提违例(precondition violation指API的调用方没有遵循调用约定). 3.错误(error)

Java中的checked exception和unchecked exception

Java中的checked exception和unchecked exception Java中有两种异常:checked exception和unchecked exception. checked exception checked exception是这样定义: A checked exception is an exception that must be either caught or declared in a method where it can be thrown. 也就是

checked exception和unchecked exception区别

http://blog.csdn.net/yuefengyuan/article/details/6204317 一. Java 中定义了两类异常: 1) Checked exception: 这类异常都是Exception的子类 .异常的向上抛出机制进行处理,如果子类可能产生A异常,那么在父类中也必须throws A异常.可能导致的问题:代码效率低,耦合度过高.C#中就没有使用这种异常机制. 2) Unchecked exception: 这类异常都是RuntimeException的子类,虽

vagrant yii2 Exception 'yii\db\Exception' with message 'SQLSTATE[HY000] [2002]

开发环境:vangrant + LAMP 安装了yii2 advanced版本之后,通过url访问fornted 报数据库user表不存在,看了安装yii2 advanced的教程,里面说需要需要运行./yii migrate命令.在git bash到了advanced项目根目录执行./yii migrate命令时,报 Exception 'yii\db\Exception' with message 'SQLSTATE[HY000] [2002] 的错误. 百度了一下这个错误,说是php环境的

大视电子MVD204多屏扩展仪增加4K输入/180度旋转拼接功能

大视电子MVD204多屏扩展仪增加4K输入/180度旋转拼接功能 目前上海大视电子科技有限公司(上海股权交易中心挂牌,企业名称:大视科技:股票代码:201276)MVD20X多屏扩展仪, 已经销售到海内外50多个国家和地区.大视电子根据客户的需求,增加180度旋转功能,虽然目前超窄边的液晶价格已经下滑很多,但是相对传统的液晶电视价 格还是高出不少,往往在酒吧,展馆展示,舞台搭建等成本比较敏感的场合.整个系统的成本会非常关键.但是传统的显示器或者液晶电视机四边不是平整的,往往 是下边有凸起,上边比

java中的Checked Exception和Unchecked Exception的区别

Java 定义了两种异常: - Checked exception: 继承自 Exception 类是 checked exception.代码需要处理 API 抛出的 checked exception,要么用 catch 语句,要么直接用 throws 语句抛出去. - Unchecked exception: 也称 RuntimeException,它也是继承自 Exception.但所有 RuntimeException 的子类都有个特点,就是代码不需要处理它们的异常也能通过编译,所以它

ckecked Exception和Unchecked Exception异常

Throwable 是所有 Java 程序中错误处理的父类 Error JVM Exception 程序 Checked Exception:继承java.lang.Exception 代表程序不能控制的无效外界情况.除了Error以及RuntimeException(运行时异常)及其子类,如:ClassNotFoundException, NamingException, ServletException, SQLException, IOException等.JAVA 编译器强制要求try