How to use Try, catch, Finally and Exception in php

Asked

Viewed 1,315 times

2

I’m with source where I need now adapt it to use the try, catch, finally and exception and I’m not getting it, this source already has some try´s with catch(PDOException $erro) where I do some validations, because I’m making a return call JSon and returning the status of the operation to the user and I believe that, now, they will be unnecessary. I tried to isolate the messages to throw them in the exception by eliminating them from the body of the code, but as I said unsuccessfully, I don’t know exactly what has to be done, because I have several interactions between select, delete and insert to only send the commit or rollBack and send a message to the user, finalizing the process.

What I got so far:

The call:

$(document).ready(function(){
    $(function () {
        // Validation
        $("#frmGravaDados").validate({
            // Do not change code below
            errorPlacement: function (error, element) {
                error.insertAfter(element.parent());
            },
            submitHandler: function (form) {

                var data = $(form).serialize();

                console.log(data);

                $.ajax({
                    type: 'POST',
                    url: 'ajax/pInterfaceServico.php',
                    data: data,
                    dataType: 'json',
                    beforeSend: function () {
                        $("#msgBusca").html('×AVISO! Enviando...');
                    },
                    success: function (response) {
                        if (response.codigo == "1") {
                            $("#msgBusca").html('×AVISO!' + response.mensagem  + '');                          

                        } else {
                            $("#msgBusca").html('×ATENÇÃO! ' + response.mensagem + '');
                        }
                    },
                    error: function (xhr, ajaxOptions, thrownError) {
                        console.log(xhr, ajaxOptions, thrownError);
                        $("#msgInsert").html('×ATENÇÃO! Ocorreu um erro no registro de direito. Contate o suporte técnico.');
                    }
                });
                return false;
            }
        });
    }); 
});

The code in the php:

// ATRIBUI UMA CONEXÃO PDO   
$conexao = Conexao::getInstance();
$crud    = Crud::getInstance($conexao);

// DADOS DO FORMULÁRIO
$IdInterface = (isset($_POST['IdInterface'])) ? $_POST['IdInterface'] : '';
$IdUsuario = (isset($_POST['IdUsuario'])) ? $_POST['IdUsuario'] : '';
$Servicos = (isset($_POST['Servicos'])) ? $_POST['Servicos'] : '';

try {
    // BUSCANDO REGISTROS USUÁRIO X SERVIÇO
    $sql = "SELECT 
              `gasServico`.IdServico,
              `gasUsuarioServico`.IdUsuario
            FROM
              `gasServico`
              INNER JOIN `gasUsuarioServico` ON (`gasServico`.IdServico = `gasUsuarioServico`.IdServico)
            WHERE
              (`gasUsuarioServico`.IdServico = `gasServico`.IdServico) AND 
              (`gasUsuarioServico`.IdUsuario = ?) AND 
              (`gasServico`.IdInterface = ?)";
    $stm = $conexao->prepare($sql);
    // DEFINE O TIPO DA VARIÁVEL PDO::PARAM_INT OU STR
    $stm->bindValue(1, $IdUsuario, PDO::PARAM_INT);
    $stm->bindValue(2, $IdInterface, PDO::PARAM_INT);
    $stm->execute();
    $ResDados = $stm->fetchAll(PDO::FETCH_OBJ); 
    // CONTAGEM DE REGISTROS RETORNADOS
    $conProd = count($ResDados);  
    // FECHANDO A CONSULTA
    $stm->closeCursor();  

    // DELETANDO REGISTROS USUÁRIO X SERVIÇO
    foreach ($ResDados as $DadosUsuarioServico) { 
        try{            

            $IdUsuario = $DadosUsuarioServico->IdUsuario;
            $IdServico = $DadosUsuarioServico->IdServico;

            $sql = "DELETE FROM `gasUsuarioServico` WHERE `IdUsuario` = ? AND `IdServico` = ?";
            $stm = $conexao->prepare($sql);
            $stm->bindValue(1, $IdUsuario, PDO::PARAM_INT);
            $stm->bindValue(2, $IdServico, PDO::PARAM_INT);                    
            $stm->execute();                
            $retorno = array('codigo' => '1', 'mensagem' => ' Serviços excluídos com sucesso'); 
        } catch(PDOException $erro) {  
            $erro = $erro->getMessage();
            $retorno = array('codigo' => '0', 'mensagem' => ' Erro ao deletar os serviços. Tente novamente. ::$erro');
        }       
    }

    // GRAVANDO OS CHECKS MARCADOS
    if ($Servicos != "") {  
        try {   
            foreach($Servicos as $IdServico) {  
                // INSERT
                $crud = $conexao->prepare("INSERT INTO gasUsuarioServico (IdUsuario, IdServico) VALUES (?, ?)");
                $crud->bindParam(1, $IdUsuario , PDO::PARAM_INT);
                $crud->bindParam(2, $IdServico , PDO::PARAM_INT);       
                $crud->execute();       
                $retorno = array('codigo' => '1', 'mensagem' => ' Serviços inseridos com sucesso'); 
            }       
        } catch(PDOException $erro) {  
                $erro = $erro->getMessage();
                $retorno = array('codigo' => '0', 'mensagem' => ' Erro ao inserir os serviços. Tente novamente. ::$erro');
        }
    }

    // BUSCANDO REGISTROS USUÁRIO X SERVIÇO
    $sqlInterface = "    
        SELECT 
              gasUsuarioServico.IdUsuario,
              gasUsuarioServico.IdServico,
              gasServico.IdInterface
            FROM
              gasUsuarioServico
              INNER JOIN gasServico ON (gasUsuarioServico.IdServico = gasServico.IdServico)
            WHERE
              (gasUsuarioServico.IdUsuario = ?) AND 
              (gasServico.IdInterface = ?)";
    $stm = $conexao->prepare($sqlInterface);
    // DEFINE O TIPO DA VARIÁVEL PDO::PARAM_INT OU STR
    $stm->bindValue(1, $IdUsuario, PDO::PARAM_INT);
    $stm->bindValue(2, $IdInterface, PDO::PARAM_INT);
    $stm->execute();    
    $ResDadosInterface = $stm->fetchAll(PDO::FETCH_OBJ); 
    // CONTAGEM DE REGISTROS RETORNADOS
    $conSqlDel = count($ResDadosInterface); 
    // FECHANDO A CONSULTA
    $stm->closeCursor();  

    // DELETANDO REGISTROS USUÁRIO X INTERFACE
    if ($conSqlDel == 0) {
        try {
                $sql = "DELETE FROM gasUsuarioInterface WHERE gasUsuarioInterface.IdUsuario = ? AND gasUsuarioInterface.IdInterface = ?";
                $stm = $conexao->prepare($sql);        
                $stm->bindValue(1, $IdUsuario, PDO::PARAM_INT);
                $stm->bindValue(2, $IdInterface, PDO::PARAM_INT);                    
                $stm->execute(); 
                $retorno = array('codigo' => '1', 'mensagem' => ' Interfaces do usuários deletadas com sucesso');
        } catch(PDOException $erro) {  
                $erro = $erro->getMessage();
                $retorno = array('codigo' => '0', 'mensagem' => ' Erro ao deletar interfaces para o usuário. Tente novamente. ::$erro');
        }   
    } else {

        // BUSCANDO REGISTROS INTERFACES
        $sqlInterfaceReg = "    
                SELECT * FROM
                    gasUsuarioInterface
                WHERE
                    (gasUsuarioInterface.IdUsuario = ?) AND 
                    (gasUsuarioInterface.IdInterface = ?)";
            $stm = $conexao->prepare($sqlInterfaceReg);
            // DEFINE O TIPO DA VARIÁVEL PDO::PARAM_INT OU STR
            $stm->bindValue(1, $IdUsuario, PDO::PARAM_INT);
            $stm->bindValue(2, $IdInterface, PDO::PARAM_INT);
            $stm->execute();        
            $ResUsuarioInterface = $stm->fetchAll(PDO::FETCH_OBJ); 
            $countInsert = count($ResUsuarioInterface);
            // FECHANDO A CONSULTA
            $stm->closeCursor();    

        if ($countInsert == 0) {
            try {
                // INSERT USUÁRIO X INTERFACE           
                $crud = $conexao->prepare("INSERT INTO gasUsuarioInterface (IdUsuario, IdInterface) VALUES (?, ?)");
                $crud->bindParam(1, $IdUsuario , PDO::PARAM_INT);
                $crud->bindParam(2, $IdInterface , PDO::PARAM_INT);     
                $crud->execute();       
                $retorno = array('codigo' => '1', 'mensagem' => ' Interfaces do usuários inseridas com sucesso');
            } catch(PDOException $erro) {  
                $erro = $erro->getMessage();
                $retorno = array('codigo' => '0', 'mensagem' => ' Erro ao deletar interfaces para o usuário. Tente novamente. ::$erro');
            }           
        }
    }   
} catch (Exception $e) { 
    echo $e->getMessage();
}

// FECHA CONEXÃO
$conexao = null;        

// RETORNO DE MENSAGEM
echo json_encode($retorno);
exit();

2 answers

2

After some research and help from some friends I got what I needed and I come to share with you the final result, I hope I can help someone.

Code commented, follows:

// ATRIBUI UMA CONEXÃO PDO   
$conexao = Conexao::getInstance();
$crud    = Crud::getInstance($conexao);

// DADOS DO FORMULÁRIO
$IdInterface = (isset($_POST['IdInterface'])) ? $_POST['IdInterface'] : '';
$IdUsuario = (isset($_POST['IdUsuario'])) ? $_POST['IdUsuario'] : '';
$Servicos = (isset($_POST['Servicos'])) ? $_POST['Servicos'] : '';

try {

    // INICIALIZA A TRANSAÇÃO
    $conexao->beginTransaction();

    // BUSCANDO REGISTROS USUÁRIO X SERVIÇO
    $sql = "SELECT 
              `gasServico`.IdServico,
              `gasUsuarioServico`.IdUsuario
            FROM
              `gasServico`
              INNER JOIN `gasUsuarioServico` ON (`gasServico`.IdServico = `gasUsuarioServico`.IdServico)
            WHERE
              (`gasUsuarioServico`.IdServico = `gasServico`.IdServico) AND 
              (`gasUsuarioServico`.IdUsuario = ?) AND 
              (`gasServico`.IdInterface = ?)";
    $stm = $conexao->prepare($sql);
    // DEFINE O TIPO DA VARIÁVEL INT OU STR
    $stm->bindValue(1, $IdUsuario, PDO::PARAM_INT);
    $stm->bindValue(2, $IdInterface, PDO::PARAM_INT);
    $stm->execute();
    $ResDados = $stm->fetchAll(PDO::FETCH_OBJ); 
    // CONTAGEM DE REGISTROS RETORNADOS
    $conProd = count($ResDados);  
    // FECHANDO A CONSULTA
    $stm->closeCursor();  

    // DELETANDO REGISTROS USUÁRIO X SERVIÇO
    foreach ($ResDados as $DadosUsuarioServico) { 
        try{

            $IdUsuario = $DadosUsuarioServico->IdUsuario;
            $IdServico = $DadosUsuarioServico->IdServico;

            $sql = "DELETE FROM `gasUsuarioServico` WHERE `IdUsuario` = ? AND `IdServico` = ?";
            $stm = $conexao->prepare($sql);
            $stm->bindValue(1, $IdUsuario, PDO::PARAM_INT);
            $stm->bindValue(2, $IdServico, PDO::PARAM_INT);                    
            $stm->execute(); 

        } catch(PDOException $erro) { 

            // DESFAZ TRANSAÇÃO ATUAL           
            $conexao->rollBack();           
            $erro = $erro->getMessage();
            $retorno = array('codigo' => '0', 'mensagem' => ' Erro ao deletar os serviços. Tente novamente [1]. ::$erro');  
            $conexao = null;        

            // RETORNO DE MENSAGEM
            echo json_encode($retorno);
            exit(); 

        }       
    }

    // GRAVANDO OS CHECKS MARCADOS
    if ($Servicos != "") {  
        try {   

            foreach($Servicos as $IdServico) {  
                // INSERT
                $crud = $conexao->prepare("INSERT INTO gasUsuarioServico (IdUsuario, IdServico) VALUES (?, ?)");
                $crud->bindParam(1, $IdUsuario , PDO::PARAM_INT);
                $crud->bindParam(2, $IdServico , PDO::PARAM_INT);       
                $crud->execute();                       
            }       

        } catch(PDOException $erro) {  

                // DESFAZ TRANSAÇÃO ATUAL
                $conexao->rollBack();           
                $erro = $erro->getMessage();
                $retorno = array('codigo' => '0', 'mensagem' => ' Erro ao inserir os serviços. Tente novamente [2]. ::$erro');
                $conexao = null;        

                // RETORNO DE MENSAGEM
                echo json_encode($retorno);
                exit();             

        }
    }

    // BUSCANDO REGISTROS USUÁRIO X SERVIÇO
    $sqlInterface = "SELECT 
                      gasUsuarioServico.IdUsuario,
                      gasUsuarioServico.IdServico,
                      gasServico.IdInterface
                    FROM
                      gasUsuarioServico
                      INNER JOIN gasServico ON (gasUsuarioServico.IdServico = gasServico.IdServico)
                    WHERE
                      (gasUsuarioServico.IdUsuario = ?) AND 
                      (gasServico.IdInterface = ?)";
    $stm = $conexao->prepare($sqlInterface);
    // DEFINE O TIPO DA VARIÁVEL INT OU STR
    $stm->bindValue(1, $IdUsuario, PDO::PARAM_INT);
    $stm->bindValue(2, $IdInterface, PDO::PARAM_INT);
    $stm->execute();    
    $ResDadosInterface = $stm->fetchAll(PDO::FETCH_OBJ); 
    // CONTAGEM DE REGISTROS RETORNADOS
    $conSqlDel = count($ResDadosInterface); 
    // FECHANDO A CONSULTA
    $stm->closeCursor();  

    // DELETANDO REGISTROS USUÁRIO X INTERFACE SE EXISTI SOBRAS
    if ($conSqlDel == 0) {
        try {

            $sql = "DELETE FROM gasUsuarioInterface WHERE gasUsuarioInterface.IdUsuario = ? AND gasUsuarioInterface.IdInterface = ?";
            $stm = $conexao->prepare($sql);        
            $stm->bindValue(1, $IdUsuario, PDO::PARAM_INT);
            $stm->bindValue(2, $IdInterface, PDO::PARAM_INT);                    
            $stm->execute();            

        } catch(PDOException $erro) {  

            // DESFAZ TRANSAÇÃO ATUAL
            $conexao->rollBack();
            $erro = $erro->getMessage();
            $retorno = array('codigo' => '0', 'mensagem' => ' Erro ao deletar interfaces para o usuário. Tente novamente [3]. ::$erro');
            $conexao = null;        

            // RETORNO DE MENSAGEM
            echo json_encode($retorno);
            exit();             

        }   
    } else {

        // BUSCANDO REGISTROS INTERFACES
        $sqlInterfaceReg = "    
                SELECT * FROM
                    gasUsuarioInterface
                WHERE
                    (gasUsuarioInterface.IdUsuario = ?) AND 
                    (gasUsuarioInterface.IdInterface = ?)";
            $stm = $conexao->prepare($sqlInterfaceReg);
            // DEFINE O TIPO DA VARIÁVEL INT OU STR
            $stm->bindValue(1, $IdUsuario, PDO::PARAM_INT);
            $stm->bindValue(2, $IdInterface, PDO::PARAM_INT);
            $stm->execute();        
            $ResUsuarioInterface = $stm->fetchAll(PDO::FETCH_OBJ); 
            $countInsert = count($ResUsuarioInterface);
            // FECHANDO A CONSULTA
            $stm->closeCursor();    

        if ($countInsert == 0) {
            try {

                // INSERT USUÁRIO X INTERFACE           
                $crud = $conexao->prepare("INSERT INTO gasUsuarioInterface (IdUsuario, IdInterface) VALUES (?, ?)");
                $crud->bindParam(1, $IdUsuario, PDO::PARAM_INT);
                $crud->bindParam(2, $IdInterface, PDO::PARAM_INT);      
                $crud->execute();                       

            } catch(PDOException $erro) {  

                // DESFAZ TRANSAÇÃO ATUAL
                $conexao->rollBack();

                $erro = $erro->getMessage();
                $retorno = array('codigo' => '0', 'mensagem' => ' Erro ao deletar interfaces para o usuário. Tente novamente [4]. ::$erro');                
                $conexao = null;        

                // RETORNO DE MENSAGEM
                echo json_encode($retorno);
                exit();                 

            }           
        }
    }   

    $conexao->commit();

} catch (Exception $e) {    

    // DESFAZ TRANSAÇÃO ATUAL
    $conexao->rollBack();   
    $retorno = array('codigo' => '0', 'mensagem' => ' Ocorreu um erro na gravação, tente novamente [5]. ::$erro');              
    $conexao = null;        

    // RETORNO DE MENSAGEM
    echo json_encode($retorno);
    exit();     
}

$retorno = array('codigo' => '1', 'mensagem' => ' Direito de Acesso inserido com sucesso'); 

// FECHA CONEXÃO
$conexao = null;        

// RETORNO DE MENSAGEM
echo json_encode($retorno);
exit();
  • 3

    Although he was able to do what he was looking for, a conclusive answer to how to use the finallyin php

2


The structure of try, catch finaly is quite simple.

Within the try you put the code you risk generating exceptions.

You can have one or more catch, if you want to create different treatments for different types of exception. In your case you are creating a special treatment when the error is generated in the PDO PDOException.

And in the finally what will be executed only if what was contained in try run without generating exceptions.

    try {
        //código que deseja ser executado
    } catch (PDOException $erro) {
        echo '$erro->getMessage();';
    } catch (Exception $e) {
        echo '$e->getMessage();';
    } finally {
        //o que deseja que seja executado apenas se ocorreu tudo bem dentro do         try
    }
    //qualquer coisa que deseja executar após o try catch

For example, if you want to save a user in a bank, and after it is saved in the database you want to link it to other tables.

Within the try you place the stop where you save the user, and finally calls the methods that will perform the other operations.

  • 1

    I did a test in PHP code and found that Exception should be the last level of Exceptions. That is, Pdoexception must be a catch prior to the Exception catch; http://sandbox.onlinephpfunctions.com/code/ee7c5dbb86ff324fcc145ce1f64f4660b76711c9

  • @Don'tPanic changed the example, thanks. I added the remark about being able to have one or more, but this detail passed beaten

  • 1

    One detail about Finally: if what’s inside TRY or CATCH is closing the context, Finally is triggered earlier. for example, if instead of "echo"s had "Return"s, only Finally’s Return would be triggered. You can test! PHP 5.5+

Browser other questions tagged

You are not signed in. Login or sign up in order to post.