Php 检测是否在不使用自定义异常类的情况下手动引发异常

Php 检测是否在不使用自定义异常类的情况下手动引发异常,php,exception,exception-handling,try-catch,Php,Exception,Exception Handling,Try Catch,我的php应用程序中有一个try-catch块,如下所示: try { if ($userForgotToEnterField) { throw new Exception('You need to fill in your name!'); } ... doDifferentThingsThatCanThrowExceptions(); ... } catch (ExpectedException $e) { $template->setError('A

我的php应用程序中有一个
try-catch
块,如下所示:

try {
  if ($userForgotToEnterField) {
     throw new Exception('You need to fill in your name!');
  }
  ...
  doDifferentThingsThatCanThrowExceptions();
  ...
} catch (ExpectedException $e) {
  $template->setError('A database error occured.');
} catch (Exception $e) {
  $template->setError($e->getMessage());
}
我只想为我手动抛出的带有自定义错误文本的异常输出
$e->getMessage()
,而不是由其他代码抛出的异常,因为这些异常可能包含用户不应该看到的敏感信息或非常技术性的信息


在不使用自定义异常类的情况下,是否可以区分手动引发的异常和由某个方法引发的随机异常?

我已经考虑过这一点,我想说,您所做的操作确实需要自定义异常类。如果您想绕过它(这最终会让人更加困惑),您基本上会创建一个所有异常都可以修改的全局(或相同范围)变量,并在抛出块标记中使用它

$threwCustomException = false;

try {
  if ($userForgotToEnterField) {
     throw new Exception('You need to fill in your name!');
     $threwCustomException = true;
  }
  ...
  doDifferentThingsThatCanThrowExceptions();
  ...
} catch (ExpectedException $e) {
  $template->setError('A database error occured.');
} catch (Exception $e) {
    if($threwCustomException){
        //Whatever custom exception handling you wanted here....
    }
  $template->setError($e->getMessage());
}
这是我能想到的最好的了。然而,这不是一个好主意,这也是允许您创建自己的异常类的全部原因。我知道您并不是在寻找这个答案,但因为您看起来好像在尝试不创建大量额外的代码,所以我会将Exception扩展为“CustomException”或特定于您的项目的其他名称,并在所有情况下抛出该名称,并以这种方式处理它。
希望这能有所帮助。

我同意最好只编写自己的异常。如果出于任何原因,您不想这样做,可以设置自定义错误消息和自定义错误代码(异常构造函数的第二个参数)。如果错误代码是您的,请检查每个抛出的异常,并仅显示以下内容:

public Exception::u construct()([string$message=”“[,
int$code=0
[,Exception$previous=NULL]])


然后使用
getCode

我看不出有人想要这样做的原因,但是你可以在抛出异常时设置一个全局变量,来区分它们。你可以扩展异常类,然后捕获自定义异常。我的项目中不需要自定义异常类。那我为什么要用呢?这造成了不必要的复杂性。感谢您对全局变量的建议,但我认为这会造成更大的混乱。但是请求的OP没有自定义异常(如果可能的话)@Zulakis:为这个场景添加自定义异常,不会使代码更复杂;它相当于简化了它(特别是对于其他开发人员来说,他们希望它是一个)
classcustomexception扩展了Exception{}
这就是我目前正在使用的;-)感觉有点傻。哈哈。。。几年前的我听到你在那里。但是如果你能从更大的角度来看它,它会使代码更容易理解,因为你以同样的方式处理所有异常,未来的程序员(包括你自己)不必找出这个疯狂的自定义错误处理系统,它真的(除非我理解错了)与这种方法没有任何不同。加上这只是清洁:)干杯!