【问题标题】:Laravel ExceptionLaravel 异常
【发布时间】:2019-01-11 22:15:49
【问题描述】:

我想创建海关例外,我想在控制器中捕获和管理它们。但我做不到。

例如

use Exception;

class MyException extends Exception
{

}

在控制器中

public function myFuncion($request){

        try{
           exceptFunction();
        } catch(MyException $e){
            repairIt();
        }
}

private function exceptFunction(){
     throw new MyException('f*ck');
}

这里的问题是catch中的代码永远不会被执行! Laravel 总是把我送到处理程序!我想在控制器中通过我的方式捕获和管理异常!

我希望你能帮助(和教导)我。

谢谢

尼古拉斯

class CajaMovimientoController {

 public function anular(AnularCajaMovimientoRequest $request) {
   ...
 if ($movimiento->isIngreso()) {
            try {
                $this->checkSaldo($movimiento->apertura_id, $movimiento->valores, false);
            } catch (Exception $e) {
                dd("catch");
                return redirect()->back()->with('mensajes', $e->getMessage());
            }
            dd("anular ingreso");
        } else {
            $this->checkSaldo($movimiento->apertura_id, $movimiento->valores, true);
            dd("anular egreso");
        }
    }

    private function checkSaldo($sessionId, $valores, $ingreso) {
        $cajaApertura = CajaApertura::find($sessionId);
        $sft = 0;
        $sch = 0;
        $monto = 0;
        foreach ($valores as $valor) {
            $monto = $monto + floatval($valor->monto);
            if ($valor->cheque_id != null) {
                $sch = $sch + floatval($valor->monto);
            } else {
                $sft = $sft + floatval($valor->monto);
            }
        }
        if (!$ingreso) {
            if ($sft > $cajaApertura->efectivo) {
                throw new CajaSaldoException('No puede egresar mas efectivo del que posee');
//            return redirect()->back()->with('mensajes', 'No puede egresar mas efectivo del que posee');
            }

            if ($sch > $cajaApertura->cheque) {
                throw new CajaSaldoException('No puede egresar mas cheques del que posee');
//            return redirect()->back()->with('mensajes', 'No puede egresar mas cheques del que posee');
            }
        }
        for ($i = 0; $i < count($valores); $i++) {
            //protected $fillable = ['id','movimiento_id', 'cheque_id', 'monto'
            if ($valores[$i]->cheque_id != null) {
                $cheque = Cheque::find($valores[$i]->cheque_id);
                if ($cheque->caja_id != $cajaApertura->caja_id) {
                    throw new CajaSaldoException('No puede deshacer. Cheque no está en caja');
                }
                if ($ingreso) {
                    if ($cheque->estado != 2) {
                        throw new CajaSaldoException('No puede reingresar cheque');
                    }
                } else {
                    if ($cheque->estado != 1) {
                        throw new CajaSaldoException('No puede egresar cheque');
                    }
                }
            }
        }
    }

}

我的异常类

namespace Prestamos\Exceptions;

use Exception;

class CajaSaldoException extends Exception
{
    //
}

【问题讨论】:

  • 不需要那种语言。你能不能在你的 catch 块中 dd($e) 看看你是否得到了正确的异常?还要抛出你不能做的异常exceptFunction();,它必须是$this-&gt;exceptFunction();
  • 好的...我很抱歉。 Exception的类型没有问题。我捕获 MyException 还是仅捕获 Exception 都没有关系。它总是把我送到处理程序。如果我把它放到处理程序中它可以工作......但是在处理程序中......我想在控制器中捕获异常。 if ($exception instanceof MyException) { dd('我抓住你'); }
  • 如果你在 catch 块内dd($e); 会发生什么?你能看到抛出的异常吗?
  • 什么都没发生!它把我送到处理程序,我可以在浏览器中看到错误(我没有在 Hanlder 中处理它) 哎呀,看起来出了点问题。 (1/1) MyException 这里是消息和跟踪!
  • 如果将} catch (Exception $e) { 更改为} catch (\Exception $e) { 会发生什么?

标签: laravel exception controller try-catch


【解决方案1】:

每当您想捕获异常时,请确保您在 catch 块中引用了正确的异常。

因此,您可以像这样引用该类的 FQCN

try {

} catch(\App\Exceptions\CustomException $exception) {

}

或者,您可以在类的顶部添加您的 use 语句

use App\Exceptions\CustomException; 

try {

} catch(CustomException $exception) {

}

在您的特定情况下,正在发生的事情是,您试图在不添加 use 语句的情况下捕获 \App\Exceptions\CustomException

try {

} catch(CustomException $exception) {

}

在这种情况下发生的情况是,您的代码块正在寻找App\Http\Controllers\CajaMovimientoController\CustomException 异常。

由于找不到它,因此 Laravel 将异常作为一般异常处理。阅读有关namespaces 的更多信息。

【讨论】:

  • 我用过 App\Exceptions\CajaSaldoException;但如果我把 catch(CajaSaldoException $e) 发送给处理程序
  • 你能用App\Exceptions\CajaSaldoException的内容编辑你的答案吗?
  • 您的异常命名空间是Prestamos\Exceptions,您是否在类的顶部添加了use \Prestamos\Exceptions\CajaSaldoException
  • 是的,我做到了!但如果我改变它使用 \Presamos\Exceptions\CajaSaldoException 它工作。当我导入模型时,我没有放第一个斜线......
  • 我绝对需要阅读更多关于命名空间的信息。对不起..我是 php 和 laravel 的新手
猜你喜欢
  • 2014-05-29
  • 1970-01-01
  • 1970-01-01
  • 2020-08-18
  • 2019-05-09
  • 2018-04-07
  • 2015-02-07
  • 2020-06-02
  • 2014-04-22
相关资源
最近更新 更多