2016-08-30 33 views
5

Skonfigurowałem procedurę obsługi błędów w mojej witrynie Yii.Program obsługi błędów Yii nie działa, gdy plik widoku nie zostanie znaleziony.

Oto kod.

main.php

'errorHandler'=>array(
     // use 'site/error' action to display errors 
     'errorAction'=>'site/error', 
), 

SiteController.php

public function actionError() { 
     if ($error = Yii::app()->errorHandler->error) { 
      if (Yii::app()->request->isAjaxRequest) 
       echo $error['message']; 
      else 
       $this->render('error', $error); 
     } 
    } 

strona/error.php fi

<?php 
    $this->pageTitle=Yii::app()->name . ' - Error'; 
    $this->breadcrumbs=array(
     'Error', 
    ); 
?> 

<h2>Error <?php echo $code; ?></h2> 

<div class="error"> 
    <?php echo CHtml::encode($message); ?> 
</div> 

to działa ne i przekierowanie do tej strony błędów niestandardowych Jeśli adres URL jest nieprawidłowy lub niewłaściwa funkcja połączenia z użytkownikiem. Na przykład, Jeśli w kontrolerze witryny ustawiłem funkcję contact i URL wywołania użytkownika podobny do tego localhost.com/site/contactsdffe, to przekierowuje ona do tej niestandardowej strony błędu.

Ale problem jest tutaj.

Jeśli funkcja kontrolera wywoła kontakt widoku i nie ustawiłem widoku widoków/site/contact.php, to nie nazywa się tego niestandardową stroną błędu. Daje mi to błąd wyjątku.

CException: SiteController nie może znaleźć żądanego widoku "kontakt".

Nie wiem, dlaczego obsługa błędów nie działa w tym scenariuszu. Daj mi znać, jak mogę wyświetlić niestandardową stronę błędu dla tego rodzaju błędu.

Każda pomoc docenią. Z góry dziękuję !

Odpowiedz

1

Aby korzystać site/error dla CException przełącznika production mode ustawiając YII_DEBUG false w skrypcie wejściowej (prawdopodobnie index.php w katalogu głównym projektu).

Aby użyć niestandardowej strony wyjątku, dodaj niestandardowy widok exception.php do swojego folderu.

Z Yii guide page on errors (kopalni nacisk)

Yii definiuje trzy klasy wyjątek: CException, CDbException i CHttpException. CException to ogólna klasa wyjątków. CDbException reprezentuje wyjątek, który jest spowodowany przez niektóre operacje związane z bazą danych. CHttpException reprezentuje wyjątek, który powinien być wyświetlany użytkownikom końcowym i przenosi właściwość statusCode reprezentującą kod stanu HTTP. Klasa wyjątku określa sposób wyświetlania, co wyjaśnimy poniżej.

Po zgłoszeniu błędu do komponentu aplikacji CErrorHandler, wybiera odpowiedni widok, aby wyświetlić błąd. Jeśli błąd ma być wyświetlany użytkownikom końcowym, takim jak CHttpException, użyje widoku o nazwie errorXXX, gdzie XXX oznacza kod statusu HTTP (na przykład 400, 404, 500).Jeśli błąd jest wewnętrzny i powinien być wyświetlany tylko programistom, użyje widoku o nazwie exception. W tym drugim przypadku wyświetlony zostanie pełny stos wywołań, a także informacje o błędach.

Gdy aplikacja działa w trybie produkcyjnym, wszystkie błędy, w tym błędy wewnętrzne, będą wyświetlane przy użyciu widoku errorXXX. Wynika to z tego, że stos wywołań błędu może zawierać poufne informacje. W takim przypadku programiści powinni polegać na dziennikach błędów, aby ustalić, jaka jest prawdziwa przyczyna błędu.

wyszukiwania CErrorHandler dla pliku widokiem odpowiadającym widokiem w następującej kolejności:

  • WebRoot/themes/ThemeName/views/system: jest to folder systemowy w ramach aktualnie aktywnego tematu.

  • WebRoot/protected/views/system: jest to domyślny katalog widoku systemu dla aplikacji.

  • yii/framework/views: jest to standardowy katalog widoku systemu dostarczony przez framework Yii.

W pierwszej kolejności, Yii rzuca CHttpException podczas uchwałą URL i zwraca stan HTTP 404. Na drugiej instancji, URL rozwiązuje poprawnie więc wystąpi błąd wewnętrzny i CException jest wyrzucany .