2016-08-30 18 views
5

Tôi đã thiết lập trình xử lý lỗi vào trang Yii của mình.Trình xử lý lỗi Yii không hoạt động khi không tìm thấy tệp xem

Đây là mã.

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); 
     } 
    } 

trang web/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> 

Nó đang làm việc ne và chuyển hướng đến trang lỗi tùy chỉnh này Nếu URL sai hoặc gọi sai chức năng của người dùng. Ví dụ: Nếu Trong bộ điều khiển trang web tôi đã đặt chức năng contact và URL cuộc gọi của người dùng như thế này localhost.com/site/contactsdffe thì nó sẽ chuyển hướng đến trang lỗi tùy chỉnh này.

Nhưng vấn đề là ở đây.

Nếu chức năng điều khiển gọi liên hệ xem và tôi chưa thiết lập chế độ xem/trang/contact.php thì trang này không được gọi là trang lỗi tùy chỉnh này. Nó mang lại cho tôi một lỗi ngoại lệ này.

CException: SiteController không thể tìm thấy chế độ xem được yêu cầu "liên hệ".

Tôi không biết tại sao trình xử lý lỗi không hoạt động cho trường hợp này và Vui lòng cho tôi biết rằng Làm thế nào tôi có thể hiển thị trang lỗi tùy chỉnh cho loại lỗi này.

Mọi trợ giúp sẽ đánh giá cao. Cảm ơn trước !

Trả lời

1

Để sử dụng site/error cho CException chuyển sang production mode bằng cách thiết lập YII_DEBUG false trong kịch bản entry của bạn (có lẽ là index.php ở gốc của dự án của bạn).

Để sử dụng trang ngoại lệ tùy chỉnh, hãy thêm chế độ xem tùy chỉnh exception.php vào thư mục protected/views/system của bạn.

Từ (tôi nhấn mạnh) Yii guide page on errors:

Yii định nghĩa ba lớp ngoại lệ: CException, CDbExceptionCHttpException. CException là một lớp ngoại lệ chung. CDbException đại diện cho một ngoại lệ do một số hoạt động liên quan đến DB gây ra. CHttpException đại diện cho một ngoại lệ sẽ được hiển thị cho người dùng cuối và mang thuộc tính statusCode đại diện cho mã trạng thái HTTP. Lớp của một ngoại lệ xác định cách nó sẽ được hiển thị, như chúng ta sẽ giải thích tiếp theo.

Khi lỗi được chuyển tiếp đến thành phần ứng dụng CErrorHandler, nó chọn chế độ xem phù hợp để hiển thị lỗi. Nếu lỗi được hiển thị cho người dùng cuối, chẳng hạn như CHttpException, nó sẽ sử dụng chế độ xem có tên errorXXX, trong đó XXX là viết tắt của mã trạng thái HTTP (ví dụ: 400, 404, 500).Nếu lỗi là nội bộ và chỉ được hiển thị cho nhà phát triển, nó sẽ sử dụng chế độ xem có tên exception. Trong trường hợp sau, hoàn thành ngăn xếp cuộc gọi cũng như thông tin dòng lỗi sẽ được hiển thị.

Khi ứng dụng chạy ở chế độ sản xuất, tất cả các lỗi bao gồm các lỗi nội bộ sẽ được hiển thị bằng cách sử dụng chế độ xem errorXXX. Điều này là do ngăn xếp cuộc gọi của một lỗi có thể chứa thông tin nhạy cảm. Trong trường hợp này, các nhà phát triển nên dựa vào các bản ghi lỗi để xác định nguyên nhân thực sự của một lỗi là gì.

CErrorHandler tìm kiếm cho các tập tin quan điểm tương ứng với một cái nhìn theo thứ tự sau:

  • WebRoot/themes/ThemeName/views/system: đây là thư mục hệ thống quan điểm với chủ đề đang hoạt động.

  • WebRoot/protected/views/system: đây là thư mục chế độ xem hệ thống mặc định cho ứng dụng.

  • yii/framework/views: đây là thư mục chế độ xem hệ thống chuẩn do khung công tác Yii cung cấp.

Trong trường hợp đầu tiên, Yii ném một CHttpException trong Nghị quyết của url và trả về một trạng thái HTTP của 404. Đối với trường hợp thứ hai, url giải quyết một cách chính xác vì vậy một lỗi nội bộ xảy ra và CException được ném .

Các vấn đề liên quan