当前位置: 首页 > 面试题库 >

CodeIgniter:Try Catch在模型类中不起作用

宗政深
2023-03-14
问题内容

unique对列有约束。当这段代码运行时,我从框架获取错误日志,但这不是我在Exception块中给出的。
如果唯一列存在,那么我想查询其主键并将其设置为$id并返回页面。现在它正在停止db错误,并且没有进入Catch block
这是我的代码:

try {
            $result = $this->db->insert('email', $new_email);
            if ($result)
            {
                $id = $this->db->insert_id();    
            } else {
                throw new Exception("$$$$$$$$$$$$$Log database error");
            }
        } catch (Exception $e) {
            log_message('error',$e->getMessage());
            return;
        }

**Error Messages** 我从框架中得到:

DEBUG - 2013-04-07 05:00:38 --> DB Transaction Failure
ERROR - 2013-04-07 05:00:38 --> Query error: Duplicate entry

我不知道这是怎么回事。


问题答案:

CI对异常没有很好的支持。您的数据库查询将调用一些模糊的CI error_logging东西show_error()。您需要做的是设置适当的异常处理。

基本上,您可以遵循整个食谱。

现在,您所有的数据库错误将自动引发异常。此外,您还可以在整个CI应用程序中进行良好的异常处理。

注册一个将PHP错误转换为异常的自定义错误处理程序,例如,将其放在config / config.php中

function my_error_handler($errno, $errstr, $errfile, $errline)
{
    if (!(error_reporting() & $errno))
    {
        // This error code is not included in error_reporting
        return;
    }
    log_message('error', "$errstr @$errfile::$errline($errno)" );
    throw new ErrorException( $errstr, $errno, 0, $errfile, $errline );
}
set_error_handler("my_error_handler");

注册一个未捕获的异常处理程序,在您的config / config.php中放入类似的内容

function my_exception_handler($exception)
{
    echo '<pre>';
    print_r($exception);
    echo '</pre>';
    header( "HTTP/1.0 500 Internal Server Error" );
}
set_exception_handler("my_exception_handler");

设置终止处理程序:

function my_fatal_handler()
{
    $errfile = "unknown file";
    $errstr  = "Fatal error";
    $errno   = E_CORE_ERROR;
    $errline = 0;
    $error = error_get_last();
    if ( $error !== NULL )
    {
        echo '<pre>';
        print_r($error);
        echo '</pre>';
        header( "HTTP/1.0 500 Internal Server Error" );
    }
}
register_shutdown_function("my_fatal_handler");

设置一个将断言转换为异常的自定义断言处理程序,在config / config.php中放入以下内容:

function my_assert_handler($file, $line, $code)
{
    log_message('debug', "assertion failed @$file::$line($code)" );
    throw new Exception( "assertion failed @$file::$line($code)" );
}
assert_options(ASSERT_ACTIVE,     1);
assert_options(ASSERT_WARNING,    0);
assert_options(ASSERT_BAIL,       0);
assert_options(ASSERT_QUIET_EVAL, 0);
assert_options(ASSERT_CALLBACK, 'my_assert_handler');

在控制器中使用这样的包装器

public function controller_method( )
{
    try
    {
        // normal flow
    }
    catch( Exception $e )
    {
        log_message( 'error', $e->getMessage( ) . ' in ' . $e->getFile() . ':' . $e->getLine() );
        // on error
    }
}

您可以根据自己的喜好调整和自定义整个内容!

希望这可以帮助。

您还需要拦截CI show_error方法。将其放在application / core / MY_exceptions.php中:

class MY_Exceptions extends CI_Exceptions
{
    function show_error($heading, $message, $template = 'error_general', $status_code = 500)
    {
        log_message( 'debug', print_r( $message, TRUE ) );
        throw new Exception(is_array($message) ? $message[1] : $message, $status_code );
    }
}

并在FALSE上将此设置保留在application / config / database.php中,以将数据库错误转换为异常。

$db['default']['db_debug'] = TRUE;

CI有一些(非常)弱点,例如异常处理,但是要纠正这一点还有很长的路要走。

如果要使用事务,请确保对异常进行回滚。与此相关(从不像以往一样),请使用持久性连接,因为打开的事务和其他特定于会话的数据库状态将被其他会话获取/继续。



 类似资料:
  • 我使用javap反编译了Map类。类定义仍然显示泛型类型K和V的存在。这应该被类型擦除的概念擦除。为什么没有发生这种情况? <代码>/javap-详细java。util。地图

  • 我有一个带有一个提交按钮的表单,并在控制器中设置action to destroy方法。相同的代码适用于其他窗体和控制器,但不适用于此窗体和控制器。当我在Chrome中检查我的网页时,表单标签中的操作是错误的。 这是我的表格: 我通过设置\组织\公司控制器中的编辑方法访问此表单: 下面是设置\组织\公司控制器中的销毁方法:

  • 问题内容: 我有一个简单的代码: 和这个CSS: 问题是:当我将光标从移到(应该是可见的,因为它是的子级)时,鼠标悬停被禁用了。我正在IE7中对其进行测试,在FF中它可以正常工作。我究竟做错了什么?我还意识到,当我删除标签时,它就不起作用了。有任何想法吗? 问题答案: IE7不允许您将伪类应用于非锚元素,除非您明确指定doctype。只需在页面上添加一个doctype声明,它就可以正常工作。

  • TensorFlow-Lite Android演示与它提供的原始模型mobileNet_quant_v1_224.tflite一起工作。参见:https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/lite 他们还在这里提供了其他预训练的lite模型:https://github.com/tensorflow/

  • 问题内容: 以下代码适用于Spark 1.5.2,但不适用于Spark 2.0.0。我正在使用Java 1.8。 我收到以下错误 我无法确定Spark API是否已更改或其他原因。请帮忙。谢谢。 问题答案: 在2.0中,返回而不是。试试这个:

  • 我有一个ASP. NET核心Web API。 一个endpoint,它接受一个名为搜索的模型。它有一个名为表达式类型查询的属性。这个表达式对象有子类。 我将以下JSON发布到我的endpoint(应用程序的内容类型/JSON) {"查询":{"字段ID":"主体","值":"蛋糕","运算符":"匹配"}} 首先,查询参数只是基本表达式——一个多态性问题! 所以我以为是定制的模型活页夹。 我可以针