在 Yii2 RESTful API 中覆盖 actionCreate 时如何捕获数据库异常?
How to catch DB exception when overriding actionCreate in Yii2 RESTful API?
我正在使用 Yii2 RESTful API 实现。
这是一个好的开始:http://budiirawan.com/setup-restful-api-yii2/
我正在用自己的操作覆盖 CREATE 方法:
public function actionCreate(){
$params = $_REQUEST;
if (!empty($params["name"]) && !empty($params["code"])) {
$model = new $this->modelClass;
foreach ($params as $key => $value) {
if (!$model->hasAttribute($key)) {
throw new \yii\web\HttpException(400, 'Invalid attribute:' . $key);
}
}
$model->attributes=$params;
try {
$model->save();
} catch (CDbException $ex) {
// ... NEVER REACH THIS POINT :-(
throw new \yii\web\HttpException(405, 'Error saving model');
} catch (Exception $ex) {
// ... NEVER REACH THIS POINT :-(
throw new \yii\web\HttpException(405, 'Error saving model');
}
} else {
throw new \yii\web\HttpException(400, 'No data input');
}
}
问题是在尝试保存模型时,在我的例子中,我的数据库中有一个 "Integrity constraint violation"。
我想要的是处理那个错误和 运行 我的 "catch",但我不知道如何 "catch" 这个错误,因为 Yii 是 "taking control" 并抛出 500 错误作为响应。
如何处理 "model save" 错误?
Yii2 没有CDbException
。要捕获所有与数据库相关的异常,您需要 catch(\yii\db\Exception $e){...}
并捕获任何其他异常 catch(\Exception $e){...}
您捕获了两个异常,但它们做同样的事情,所以只是
catch(\Exception $e){
throw new \yii\web\HttpException(405, 'Error saving model');
}
\Exception
是基本的 php 异常 class 所有 yii2 异常都继承自它
我正在使用 Yii2 RESTful API 实现。 这是一个好的开始:http://budiirawan.com/setup-restful-api-yii2/
我正在用自己的操作覆盖 CREATE 方法:
public function actionCreate(){
$params = $_REQUEST;
if (!empty($params["name"]) && !empty($params["code"])) {
$model = new $this->modelClass;
foreach ($params as $key => $value) {
if (!$model->hasAttribute($key)) {
throw new \yii\web\HttpException(400, 'Invalid attribute:' . $key);
}
}
$model->attributes=$params;
try {
$model->save();
} catch (CDbException $ex) {
// ... NEVER REACH THIS POINT :-(
throw new \yii\web\HttpException(405, 'Error saving model');
} catch (Exception $ex) {
// ... NEVER REACH THIS POINT :-(
throw new \yii\web\HttpException(405, 'Error saving model');
}
} else {
throw new \yii\web\HttpException(400, 'No data input');
}
}
问题是在尝试保存模型时,在我的例子中,我的数据库中有一个 "Integrity constraint violation"。
我想要的是处理那个错误和 运行 我的 "catch",但我不知道如何 "catch" 这个错误,因为 Yii 是 "taking control" 并抛出 500 错误作为响应。
如何处理 "model save" 错误?
Yii2 没有CDbException
。要捕获所有与数据库相关的异常,您需要 catch(\yii\db\Exception $e){...}
并捕获任何其他异常 catch(\Exception $e){...}
您捕获了两个异常,但它们做同样的事情,所以只是
catch(\Exception $e){
throw new \yii\web\HttpException(405, 'Error saving model');
}
\Exception
是基本的 php 异常 class 所有 yii2 异常都继承自它