Tratando mensagens de exceção

Prezados,

Possuo duas tabelas: Cidade e Estado, sendo que Cidade pertence a Estado e Cidade está com "ON DELETE RESTRICT"

Como posso manipular a exceção do banco de dados e colocar uma mensagem padrão do Yii ao invés de ver um erro de DbException quando eu tentar excluir um Estado que é referenciado por uma cidade?

Obrigado.

Tem um tópico aqui que da uma ajuda. Porém é para o erro 404. Mas é possível tratar o erro 500 (erro fatal).

http://www.yiiframework.com/forum/index.php?/topic/4188-error-action-is-not-runing/

É bem fácil, leia a documentação dessa parte pra especificar o erro a ser tratado.

O que tem que ser feito é só adicionar um componente e setar qual controle/ação vai receber o erro pra tratar.

Tipo Site/Error (controlador Site e ação Erro) que vai receber toooodos os erros do sistema.

Lá tu renderiza a tua view como tu quer.

Acho que neste tipo de situação você deve notificar ao usuário através de alert() ou uma mensagem enviada pelo PHP de que a ação de exclusão irá refletir na exclusão de todas as cidades cadastradas no banco que referenciam o respectivo estado.

Quando efetuar a ação de delete() apagar as referências de cidades junto com o respectivo estado.

o errorHandler só funciona com YII_DEBUG definido em FALSE

Valeu pela ajuda galera!

Imaginei que tivesse algo para colocar no método ‘rules’ como explicado no post http://www.yiiframework.com/forum/index.php?/topic/2642-tratamento-de-mensagens-do-banco-de-dados/page__hl__unique__fromsearch__1, mas assim já ajuda também.

Ao analisar vários posts a respeito do assunto consegui chegar na seguinte conclusão:

1) Identifiquei de onde todas as mensagens de exceção vem: seuprojeto/protected/controllers/SiteController.php




public function actionError()

	{

	    if($error=Yii::app()->errorHandler->error)

	    {

	    	if(Yii::app()->request->isAjaxRequest)

                    echo $error['message'];

	    	else

                    $this->render('error', $error);      

	        	

	    }

	}



2) Criei uma classe em: meuprojeto/protected/components/Erros.php




<?php

class Erros {


    static function trataErro($error) {


        switch($error['code']){

            case 404: $error['message'] = 'A página requisitada não existe.'; break;

            case 500: $error['message'] = 'Este registro possui referências, delete-as para que esta operação seja possível.'; break;

        }

        

        return $error;

    }


}

?>



3) Modifiquei o método actionError() do controlador SiteController.php




public function actionError()

	{

	    if($error=Yii::app()->errorHandler->error)

	    {

                $error = Erros::trataErro($error); //minha solução


	    	if(Yii::app()->request->isAjaxRequest)

                    echo $error['message'];

	    	else

                    $this->render('error', $error);      

	        	

	    }

	}



4) Apenas um lembrete. Não deixe de verificar se o arquivo - seuprojeto/index.php está da seguinte forma:




<?php


// change the following paths if necessary

$yii=dirname(__FILE__).'/../yii/framework/yii.php';

$config=dirname(__FILE__).'/protected/config/main.php';


// remove the following lines when in production mode

defined('YII_DEBUG') or define('YII_DEBUG',false); //comente está linha ou troque o valor (se true altere para false)

// specify how many levels of call stack should be shown in each log message

defined('YII_TRACE_LEVEL') or define('YII_TRACE_LEVEL',3);




require_once($yii);

Yii::createWebApplication($config)->run();



Aleluia, um post em português. Espero ter contribuido, inté. >)

E como ficou seu actionDelete?