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
}