thinkphp5 的默认配置会开启ERRMODE_EXCEPTION
PDO::ATTR_CASE => PDO::CASE_NATURAL,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_ORACLE_NULLS => PDO::NULL_NATURAL,
PDO::ATTR_STRINGIFY_FETCHES => false,
PDO::ATTR_EMULATE_PREPARES => false,
pdo实现
pdo 的raise_impl_error
会根据配置判断是否需要抛出异常,当设置成PDO::ERRMODE_EXCEPTION
,则可以需要抛出异常
void pdo_raise_impl_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt, const char *sqlstate, const char *supp) /* {{{ */
{
...
if (dbh && dbh->error_mode != PDO_ERRMODE_EXCEPTION) { // 没有设置 ERRMODE_EXCEPTION则抛warning
php_error_docref(NULL, E_WARNING, "%s", message);
} else {
zval ex, info;
zend_class_entry *def_ex = php_pdo_get_exception_base(1), *pdo_ex = php_pdo_get_exception();
object_init_ex(&ex, pdo_ex);
zend_update_property_string(def_ex, &ex, "message", sizeof("message")-1, message);
zend_update_property_string(def_ex, &ex, "code", sizeof("code")-1, *pdo_err);
array_init(&info);
add_next_index_string(&info, *pdo_err);
add_next_index_long(&info, 0);
zend_update_property(pdo_ex, &ex, "errorInfo", sizeof("errorInfo")-1, &info);
zval_ptr_dtor(&info);
zend_throw_exception_object(&ex); // // 否则抛出异常
}
if (message) {
efree(message);
}
}
所以sql相关的错误只要try_catch还是能catch不少的