try/catch-block 没有任何效果
try/catch-block without any effect
正如我假设的那样,try/catch应该执行catch-block中定义的代码,如果try-block中有任何错误,对吗?
下面的代码不会做 that.It 会被抛出错误——在这种情况下:
Getting unknown property: common\modules\lookup\models\LAnrede::anreden
任何想法,如何分别解决我做错的问题?
<?php
use yii\helpers\Html;
use frontend\modules\bewerber\models\Bewerber;
use common\modules\basis\models\Person;
use common\modules\lookup\models\LAnrede;
use yii\base\ErrorException;
use kartik\widgets\Alert;
try {
$query_one = LAnrede::find()->innerJoin('Person', 'l_anrede.id = Person.id_anrede')->one();
$query_all = LAnrede::find()->innerJoin('Person', 'l_anrede.id = Person.id_anrede')->all();
var_dump($query_one);
var_dump($query_all);
echo"<h3>Anrede_one:" . $query_one->anrede . "</h3>";
$x = 1;
foreach ($query_all as $attributes) {
echo "<br><label>Anrede_all_$x:<br>" . $attributes->anreden . "</label>";
$x++;
}
} catch (ErrorException $error) { //fange den schweren MySQL-Fehler ab
echo Alert::widget([//informiere den Anwender,daß kein Datensatz gefunden wurde
'type' => Alert::TYPE_DANGER,
'title' => 'Konfigurationsfehler',
'icon' => 'glyphicon glyphicon-remove-sign',
'body' => 'Dem angemeldeten User ist in der Mitarbeitertabelle kein Mitarbeiter zugeordnet<br><br>' . $error,
'showSeparator' => true,
'delay' => false
]);
}
?>
ponury-kostek 的提示:
我为每个方法 try/catch-Block 在 class LAnrede 中编程。没有效果!
这里是 model/class LAnrede
<?php
namespace common\modules\lookup\models\base;
use Yii;
use yii\behaviors\TimestampBehavior;
use yii\behaviors\BlameableBehavior;
use mootensai\behaviors\UUIDBehavior;
use yii\base\ErrorException;
use kartik\widgets\Alert;
/**
* This is the base model class for table "l_anrede".
*
* @property integer $id
* @property string $anrede
*
* @property \common\modules\lookup\models\Person[] $people
*/
class LAnrede extends \yii\db\ActiveRecord {
use \mootensai\relation\RelationTrait;
/**
* This function helps \mootensai\relation\RelationTrait runs faster
* @return array relation names of this model
*/
public function relationNames() {
try {
return [
'people'
];
} catch (ErrorException $error) { //fange den schweren MySQL-Fehler ab
echo Alert::widget([//informiere den Anwender,daß kein Datensatz gefunden wurde
'type' => Alert::TYPE_DANGER,
'title' => 'Konfigurationsfehler',
'icon' => 'glyphicon glyphicon-remove-sign',
'body' => 'Dem angemeldeten User ist in der Mitarbeitertabelle kein Mitarbeiter zugeordnet<br><br>' . $error,
'showSeparator' => true,
'delay' => false
]);
}
}
/**
* @inheritdoc
*/
public function rules() {
try {
return [
[['anrede'], 'string', 'max' => 255],
[['optimistic_lock'], 'default', 'value' => '0'],
[['optimistic_lock'], 'mootensai\components\OptimisticLockValidator']
];
} catch (ErrorException $error) { //fange den schweren MySQL-Fehler ab
echo Alert::widget([//informiere den Anwender,daß kein Datensatz gefunden wurde
'type' => Alert::TYPE_DANGER,
'title' => 'Konfigurationsfehler',
'icon' => 'glyphicon glyphicon-remove-sign',
'body' => 'Dem angemeldeten User ist in der Mitarbeitertabelle kein Mitarbeiter zugeordnet<br><br>' . $error,
'showSeparator' => true,
'delay' => false
]);
}
}
/**
* @inheritdoc
*/
public static function tableName() {
try {
return 'l_anrede';
} catch (ErrorException $error) { //fange den schweren MySQL-Fehler ab
echo Alert::widget([//informiere den Anwender,daß kein Datensatz gefunden wurde
'type' => Alert::TYPE_DANGER,
'title' => 'Konfigurationsfehler',
'icon' => 'glyphicon glyphicon-remove-sign',
'body' => 'Dem angemeldeten User ist in der Mitarbeitertabelle kein Mitarbeiter zugeordnet<br><br>' . $error,
'showSeparator' => true,
'delay' => false
]);
}
}
/**
*
* @return string
* overwrite function optimisticLock
* return string name of field are used to stored optimistic lock
*
*/
public function optimisticLock() {
try {
return 'optimistic_lock';
} catch (ErrorException $error) { //fange den schweren MySQL-Fehler ab
echo Alert::widget([//informiere den Anwender,daß kein Datensatz gefunden wurde
'type' => Alert::TYPE_DANGER,
'title' => 'Konfigurationsfehler',
'icon' => 'glyphicon glyphicon-remove-sign',
'body' => 'Dem angemeldeten User ist in der Mitarbeitertabelle kein Mitarbeiter zugeordnet<br><br>' . $error,
'showSeparator' => true,
'delay' => false
]);
}
}
/**
* @inheritdoc
*/
public function attributeLabels() {
try {
return [
'id' => Yii::t('app', 'ID'),
'anrede' => Yii::t('app', 'Anrede'),
];
} catch (ErrorException $error) { //fange den schweren MySQL-Fehler ab
echo Alert::widget([//informiere den Anwender,daß kein Datensatz gefunden wurde
'type' => Alert::TYPE_DANGER,
'title' => 'Konfigurationsfehler',
'icon' => 'glyphicon glyphicon-remove-sign',
'body' => 'Dem angemeldeten User ist in der Mitarbeitertabelle kein Mitarbeiter zugeordnet<br><br>' . $error,
'showSeparator' => true,
'delay' => false
]);
}
}
/**
* @return \yii\db\ActiveQuery
*/
public function getPeople() {
try {
return $this->hasMany(\common\modules\basis\models\Person::className(), ['id_anrede' => 'id']);
} catch (ErrorException $error) { //fange den schweren MySQL-Fehler ab
echo Alert::widget([//informiere den Anwender,daß kein Datensatz gefunden wurde
'type' => Alert::TYPE_DANGER,
'title' => 'Konfigurationsfehler',
'icon' => 'glyphicon glyphicon-remove-sign',
'body' => 'Dem angemeldeten User ist in der Mitarbeitertabelle kein Mitarbeiter zugeordnet<br><br>' . $error,
'showSeparator' => true,
'delay' => false
]);
}
}
public function behaviors() {
try {
return [
'timestamp' => [
'class' => TimestampBehavior::className(),
'createdAtAttribute' => 'angelegt_am',
'updatedAtAttribute' => 'aktualisiert_am',
'value' => new \yii\db\Expression('NOW()'),
],
'blameable' => [
'class' => BlameableBehavior::className(),
'createdByAttribute' => 'angelegt_von',
'updatedByAttribute' => 'aktualisiert_von',
],
'uuid' => [
'class' => UUIDBehavior::className(),
'column' => 'id',
],
];
} catch (ErrorException $error) { //fange den schweren MySQL-Fehler ab
echo Alert::widget([//informiere den Anwender,daß kein Datensatz gefunden wurde
'type' => Alert::TYPE_DANGER,
'title' => 'Konfigurationsfehler',
'icon' => 'glyphicon glyphicon-remove-sign',
'body' => 'Dem angemeldeten User ist in der Mitarbeitertabelle kein Mitarbeiter zugeordnet<br><br>' . $error,
'showSeparator' => true,
'delay' => false
]);
}
}
/**
* @inheritdoc
* @return \common\modules\lookup\models\LAnredeQuery the active query used by this AR class.
*/
public static function find() {
try {
return new \common\modules\lookup\models\LAnredeQuery(get_called_class());
} catch (ErrorException $error) { //fange den schweren MySQL-Fehler ab
echo Alert::widget([//informiere den Anwender,daß kein Datensatz gefunden wurde
'type' => Alert::TYPE_DANGER,
'title' => 'Konfigurationsfehler',
'icon' => 'glyphicon glyphicon-remove-sign',
'body' => 'Dem angemeldeten User ist in der Mitarbeitertabelle kein Mitarbeiter zugeordnet<br><br>' . $error,
'showSeparator' => true,
'delay' => false
]);
}
}
}
这是因为导致错误use common\modules\lookup\models\LAnrede;
的行在try/catch块之外。
更准确地说,你在 common\modules\lookup\models\LAnrede
导入的文件中有错误,这就是为什么 try/catch 块不能
捕获错误。修复 LAnrede
.
中的错误
在您的 try
块中,您正在使用 $attributes->anreden
。可能在您的数据库中没有具有此名称的列(或者您仍然有数据库缓存)。指向问题,为什么 try/catch
不起作用 - 因为您正在尝试捕获错误的异常。您正在尝试捕获 yii\base\ErrorException
,但它是 'yii\base\UnknownPropertyException
异常。要正确处理它,您应该抓住 'all-in-one' 或扩展您的 catch
块:
合二为一:
} catch(\Exception $error) {
展开:
} catch (ErrorException $error) {
// do some stuff here
} catch (\yii\base\UnknownPropertyException $error) {
// do some another stuff here
} catch (\Exception $error) {
// do some stuff with any other exceptions
}
正如我假设的那样,try/catch应该执行catch-block中定义的代码,如果try-block中有任何错误,对吗? 下面的代码不会做 that.It 会被抛出错误——在这种情况下:
Getting unknown property: common\modules\lookup\models\LAnrede::anreden
任何想法,如何分别解决我做错的问题?
<?php
use yii\helpers\Html;
use frontend\modules\bewerber\models\Bewerber;
use common\modules\basis\models\Person;
use common\modules\lookup\models\LAnrede;
use yii\base\ErrorException;
use kartik\widgets\Alert;
try {
$query_one = LAnrede::find()->innerJoin('Person', 'l_anrede.id = Person.id_anrede')->one();
$query_all = LAnrede::find()->innerJoin('Person', 'l_anrede.id = Person.id_anrede')->all();
var_dump($query_one);
var_dump($query_all);
echo"<h3>Anrede_one:" . $query_one->anrede . "</h3>";
$x = 1;
foreach ($query_all as $attributes) {
echo "<br><label>Anrede_all_$x:<br>" . $attributes->anreden . "</label>";
$x++;
}
} catch (ErrorException $error) { //fange den schweren MySQL-Fehler ab
echo Alert::widget([//informiere den Anwender,daß kein Datensatz gefunden wurde
'type' => Alert::TYPE_DANGER,
'title' => 'Konfigurationsfehler',
'icon' => 'glyphicon glyphicon-remove-sign',
'body' => 'Dem angemeldeten User ist in der Mitarbeitertabelle kein Mitarbeiter zugeordnet<br><br>' . $error,
'showSeparator' => true,
'delay' => false
]);
}
?>
ponury-kostek 的提示:
我为每个方法 try/catch-Block 在 class LAnrede 中编程。没有效果! 这里是 model/class LAnrede
<?php
namespace common\modules\lookup\models\base;
use Yii;
use yii\behaviors\TimestampBehavior;
use yii\behaviors\BlameableBehavior;
use mootensai\behaviors\UUIDBehavior;
use yii\base\ErrorException;
use kartik\widgets\Alert;
/**
* This is the base model class for table "l_anrede".
*
* @property integer $id
* @property string $anrede
*
* @property \common\modules\lookup\models\Person[] $people
*/
class LAnrede extends \yii\db\ActiveRecord {
use \mootensai\relation\RelationTrait;
/**
* This function helps \mootensai\relation\RelationTrait runs faster
* @return array relation names of this model
*/
public function relationNames() {
try {
return [
'people'
];
} catch (ErrorException $error) { //fange den schweren MySQL-Fehler ab
echo Alert::widget([//informiere den Anwender,daß kein Datensatz gefunden wurde
'type' => Alert::TYPE_DANGER,
'title' => 'Konfigurationsfehler',
'icon' => 'glyphicon glyphicon-remove-sign',
'body' => 'Dem angemeldeten User ist in der Mitarbeitertabelle kein Mitarbeiter zugeordnet<br><br>' . $error,
'showSeparator' => true,
'delay' => false
]);
}
}
/**
* @inheritdoc
*/
public function rules() {
try {
return [
[['anrede'], 'string', 'max' => 255],
[['optimistic_lock'], 'default', 'value' => '0'],
[['optimistic_lock'], 'mootensai\components\OptimisticLockValidator']
];
} catch (ErrorException $error) { //fange den schweren MySQL-Fehler ab
echo Alert::widget([//informiere den Anwender,daß kein Datensatz gefunden wurde
'type' => Alert::TYPE_DANGER,
'title' => 'Konfigurationsfehler',
'icon' => 'glyphicon glyphicon-remove-sign',
'body' => 'Dem angemeldeten User ist in der Mitarbeitertabelle kein Mitarbeiter zugeordnet<br><br>' . $error,
'showSeparator' => true,
'delay' => false
]);
}
}
/**
* @inheritdoc
*/
public static function tableName() {
try {
return 'l_anrede';
} catch (ErrorException $error) { //fange den schweren MySQL-Fehler ab
echo Alert::widget([//informiere den Anwender,daß kein Datensatz gefunden wurde
'type' => Alert::TYPE_DANGER,
'title' => 'Konfigurationsfehler',
'icon' => 'glyphicon glyphicon-remove-sign',
'body' => 'Dem angemeldeten User ist in der Mitarbeitertabelle kein Mitarbeiter zugeordnet<br><br>' . $error,
'showSeparator' => true,
'delay' => false
]);
}
}
/**
*
* @return string
* overwrite function optimisticLock
* return string name of field are used to stored optimistic lock
*
*/
public function optimisticLock() {
try {
return 'optimistic_lock';
} catch (ErrorException $error) { //fange den schweren MySQL-Fehler ab
echo Alert::widget([//informiere den Anwender,daß kein Datensatz gefunden wurde
'type' => Alert::TYPE_DANGER,
'title' => 'Konfigurationsfehler',
'icon' => 'glyphicon glyphicon-remove-sign',
'body' => 'Dem angemeldeten User ist in der Mitarbeitertabelle kein Mitarbeiter zugeordnet<br><br>' . $error,
'showSeparator' => true,
'delay' => false
]);
}
}
/**
* @inheritdoc
*/
public function attributeLabels() {
try {
return [
'id' => Yii::t('app', 'ID'),
'anrede' => Yii::t('app', 'Anrede'),
];
} catch (ErrorException $error) { //fange den schweren MySQL-Fehler ab
echo Alert::widget([//informiere den Anwender,daß kein Datensatz gefunden wurde
'type' => Alert::TYPE_DANGER,
'title' => 'Konfigurationsfehler',
'icon' => 'glyphicon glyphicon-remove-sign',
'body' => 'Dem angemeldeten User ist in der Mitarbeitertabelle kein Mitarbeiter zugeordnet<br><br>' . $error,
'showSeparator' => true,
'delay' => false
]);
}
}
/**
* @return \yii\db\ActiveQuery
*/
public function getPeople() {
try {
return $this->hasMany(\common\modules\basis\models\Person::className(), ['id_anrede' => 'id']);
} catch (ErrorException $error) { //fange den schweren MySQL-Fehler ab
echo Alert::widget([//informiere den Anwender,daß kein Datensatz gefunden wurde
'type' => Alert::TYPE_DANGER,
'title' => 'Konfigurationsfehler',
'icon' => 'glyphicon glyphicon-remove-sign',
'body' => 'Dem angemeldeten User ist in der Mitarbeitertabelle kein Mitarbeiter zugeordnet<br><br>' . $error,
'showSeparator' => true,
'delay' => false
]);
}
}
public function behaviors() {
try {
return [
'timestamp' => [
'class' => TimestampBehavior::className(),
'createdAtAttribute' => 'angelegt_am',
'updatedAtAttribute' => 'aktualisiert_am',
'value' => new \yii\db\Expression('NOW()'),
],
'blameable' => [
'class' => BlameableBehavior::className(),
'createdByAttribute' => 'angelegt_von',
'updatedByAttribute' => 'aktualisiert_von',
],
'uuid' => [
'class' => UUIDBehavior::className(),
'column' => 'id',
],
];
} catch (ErrorException $error) { //fange den schweren MySQL-Fehler ab
echo Alert::widget([//informiere den Anwender,daß kein Datensatz gefunden wurde
'type' => Alert::TYPE_DANGER,
'title' => 'Konfigurationsfehler',
'icon' => 'glyphicon glyphicon-remove-sign',
'body' => 'Dem angemeldeten User ist in der Mitarbeitertabelle kein Mitarbeiter zugeordnet<br><br>' . $error,
'showSeparator' => true,
'delay' => false
]);
}
}
/**
* @inheritdoc
* @return \common\modules\lookup\models\LAnredeQuery the active query used by this AR class.
*/
public static function find() {
try {
return new \common\modules\lookup\models\LAnredeQuery(get_called_class());
} catch (ErrorException $error) { //fange den schweren MySQL-Fehler ab
echo Alert::widget([//informiere den Anwender,daß kein Datensatz gefunden wurde
'type' => Alert::TYPE_DANGER,
'title' => 'Konfigurationsfehler',
'icon' => 'glyphicon glyphicon-remove-sign',
'body' => 'Dem angemeldeten User ist in der Mitarbeitertabelle kein Mitarbeiter zugeordnet<br><br>' . $error,
'showSeparator' => true,
'delay' => false
]);
}
}
}
这是因为导致错误use common\modules\lookup\models\LAnrede;
的行在try/catch块之外。
更准确地说,你在 common\modules\lookup\models\LAnrede
导入的文件中有错误,这就是为什么 try/catch 块不能
捕获错误。修复 LAnrede
.
在您的 try
块中,您正在使用 $attributes->anreden
。可能在您的数据库中没有具有此名称的列(或者您仍然有数据库缓存)。指向问题,为什么 try/catch
不起作用 - 因为您正在尝试捕获错误的异常。您正在尝试捕获 yii\base\ErrorException
,但它是 'yii\base\UnknownPropertyException
异常。要正确处理它,您应该抓住 'all-in-one' 或扩展您的 catch
块:
合二为一:
} catch(\Exception $error) {
展开:
} catch (ErrorException $error) {
// do some stuff here
} catch (\yii\base\UnknownPropertyException $error) {
// do some another stuff here
} catch (\Exception $error) {
// do some stuff with any other exceptions
}