[RESOLVIDO] Exception PHP e Exceções do Laravel?

Ao usar a classe Exception nos blocos try catch, exceções do Laravel não são capturadas me levando a deduzir, entre outras possibilidades que as classes de exceções do Laravel não herdam da classe Exception, como acontece em outras linguagens, exemplo, Java. Como posso ter uma ou várias exceções, sempre preferi usar a classe que em outras linguagens são usadas para servir de base a outras exceções, mas isto não tem ocorrido no Laravel.
Como posso tornar isto simples, sem precisar fazer uma tratativa para cada provável exceção?

As classes de exceção que foram escrita para o Laravel herdam da classe Exception da base do PHP que na sua versão 7 implementa a interface Throwable.

Alguns exemplos:

<?php

namespace League\Flysystem;

class Exception extends \Exception
{
    //
}

<?php

/*
 * This file is part of Psy Shell.
 *
 * (c) 2012-2017 Justin Hileman
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Psy\Exception;

/**
 * A break exception, used for halting the Psy Shell.
 */
class BreakException extends \Exception implements Exception
{
    private $rawMessage;

    /**
     * {@inheritdoc}
     */
    public function __construct($message = '', $code = 0, \Exception $previous = null)
    {
        $this->rawMessage = $message;
        parent::__construct(sprintf('Exit:  %s', $message), $code, $previous);
    }

    /**
     * Return a raw (unformatted) version of the error message.
     *
     * @return string
     */
    public function getRawMessage()
    {
        return $this->rawMessage;
    }

    /**
     * Throws BreakException.
     *
     * Since `throw` can not be inserted into arbitrary expressions, it wraps with function call.
     *
     * @throws BreakException
     */
    public static function exitShell()
    {
        throw new self('Goodbye');
    }
}

Nesse caso exemplo tem \Exception e implementa Exception, onde \Exceptioné a classe base do PHP para exceções e Exception é um interface criada por esse pacote. Outro fator importante as várias exceções criados por esse pacote no final tem uma herança da classe base \Exception.

As linguagens que eu conheço Vb6, Vb.net, C#, ASPVbScript e PHP todas essas tem a sua classe base de exceção, julgo eu que isso deve ser um padrão estabelecidos pelas linguagens de programação.

Como toda exceção lançada possui a sua classe base, você consegue resgatar um dado não trabalhado, ou seja, uma mensagem padrão que não denota e não transparece o qual o erro aconteceu, mas, sim um genérico do erro.

Você poderia exemplificar com um exemplo simples de como queria que isso trabalhasse para que possamos entender com maior amplitude a sua duvida, mas, todas as classes escritas em PHP para exceção herdam da classe \Exception.

1 curtida

O exemplo que me pediu é o relato de como eu fazia em java, mas vou descrever como se fosse em PHP.

try 
{
    Mail::to()...
    Usuarios::whereRaw("");....
    ...
    return "Mensagem de sucesso"...;
catch(Exception $e) 
{
  return "Ocorreu um ou mais erros ao tentar fazer algo. Erro(s):".
         $e->getMessage();
}

Na maioria das exceções, como as de QueryBuilder, ele lança elas da forma padrão do Laravel, sem apresentar a mensagem que defini.

Precisa definir algum namespace ou fazer algo a mais?

O Laravel apresenta a forma de como está configurado, se quiser algo especifico se pode desabilitar a forma do debug no arquivo .env:

APP_DEBUG=false

ou no app.php da pasta config:

/*
    |--------------------------------------------------------------------------
    | Application Debug Mode
    |--------------------------------------------------------------------------
    |
    | When your application is in debug mode, detailed error messages with
    | stack traces will be shown on every error that occurs within your
    | application. If disabled, a simple generic error page is shown.
    |
    */

    'debug' => env('APP_DEBUG', false),

nesse trecho até explica se o dado estiver false um página simples de erro para aparecer para você (If disabled, a simple generic error page is shown), e é isso que o PHP vai apresentar, apesar que não é bom deixar isso aparecer, mas, é assim que vai solucionar a sua pergunta (Não recomendado)

1 curtida

E no caso de eu colocar o try catch, o Laravel ao invés de uma página simples vai apresentar minha mensagem, certo?

Vai seguir também as configurações do php.ini do seu PHP configurado no seu computador, ou seja, depende de como isso está configurado.

Exemplo: nos servidores WEB as paginas de erros são configuradas para não aparecer, motivo principal, segurança, apresentar erros na produção é um erro grave.

Ou seja, resumindo, existem fatores anexados, e a lógica é essa de sair aquilo que você configura, mas, é um coisa que eu dou como exemplo, descaracterizar o framework só por causa disso na minha visão (opinião e experiência) não é bom.

1 curtida

Gravei um vídeo pra mostrar que a mensagem definida dentro do catch não aparece.
Uma observação é que estou rodando de dentro do servidor interno do Laravel e não de outro, como o Apache.
Clique aqui.

Com as configurações que eu passei para você APP_DEBUG=false você fazendo esse código aparece sim o mensagem da exceção, exemplo do código:

public function index()
{
	try {
		$model = $this->post->get();
		return view('postaaa.index', compact('model'));
	} catch (\Exception $e) {
		return 'erro na sua view';
	}
}

Porque dá o erro? Porque o nome correta da view é post.index, video:

Se você quer o erro bem especifico pode cocatenar $e->getMessage(), junto.

Ou seja, o que aconteceu com você pode ser uma simples configuração e esse código também roda no servidor do PHP que na verdade é um apache (mascarado).

No seu vídeo eu não conseguir ver todo o código precisa realmente ver esse código, mas, também tem que ver \Exception se você colocou isso certo, porque no Laravel tem isso em vários pacotes com o mesmo nome.

1 curtida

Continuando, eu to achando que é a confusão da classe de Exception, precisa ver todo o namespace e conferir todo o projeto

Se colocar classes relacionadas dá a exceção da classe acima e não da sua base.

Bom eu fiz o teste gravei o gif para você ver … é isso …

1 curtida

Tem que definir namespace? Se sim, qual é.

O namespace é esse:

use \Exception;

Mas mesmo assim estou achando estranho o seu não dar certo bom testa não custa nada.

1 curtida