请问 (PDOException $e) 和 PDOException($e->getMessage(), (int)$e->getCode()) 最简单的意思是什么?
Please what does (PDOException $e) and PDOException($e->getMessage(), (int)$e->getCode()) mean in simplest terms?
您能解释一下 (PDOException $e) 和 PDOException($e->getMessage(), (int)$e->getCode()) 在这里的作用和含义吗?
try
{
$pdo = new PDO($attr, $user, $pass, $opts);
}
catch (PDOException $e)
{
throw new PDOException($e->getMessage(), (int)$e->getCode());
}
让我们比较这段代码使用和不使用 try catch 的输出
$pdo = new PDO('foo', 'username', 'password');
会给我们
PHP Fatal error: Uncaught PDOException: PDO::__construct():
Argument #1 ($dsn) must be a valid data source name in pdo.php:6
Stack trace:
#0 C:\SERVER\www\htdocs\pdo.php(6): PDO->__construct('foo', 'username', 'password')
#1 {main} thrown in pdo.php on line 6
注意用户名和密码可以在错误信息中看到
现在使用 try catch 和 re-throw
try
{
$pdo = new PDO('foo', 'username', 'password');
}
catch (PDOException $e)
{
throw new PDOException($e->getMessage(), (int)$e->getCode());
}
输出将是
PHP Fatal error: Uncaught PDOException: PDO::__construct():
Argument #1 ($dsn) must be a valid data source name in pdo.php:12
Stack trace:
#0 {main}
thrown in pdo.php on line 12
如您所见,没有用户名或密码。
这是使用如此笨拙代码的唯一原因
最好的起点是 the PHP manual page on Exceptions。
异常是一种强制错误处理机制 - 抛出异常会中止所有运行代码,而不是设置后续代码必须主动检查的标志一个匹配的 catch
块。如果没有找到 catch
块,则整个脚本退出。
catch
块使用与 the instanceof
operator 相同的逻辑进行匹配 - 你命名一个 class 或接口,异常必须是相同的 class,一个 sub-class,或实现该接口。然后你给一个变量名 - 在你的例子 $e
中,但它可以是你喜欢的任何名字 - 并且 PHP 将异常分配给该变量并运行 catch
块的内容。
创建 异常与创建任何其他对象相同 - 您使用 new
运算符。创建后,它们可以具有属性和方法,包括包含 getMessage()
和 getCode()
的默认集,这些 return 值是在最初构造时传递的。当您使用 throw
关键字时,它们会发生特殊行为。
因此,您显示的代码:
- 运行一些可能引发异常的代码 (
new PDO(...)
)
- 捕获任何匹配
instanceof PDOException
的异常
- 在该异常对象上查找“消息”和“代码”
- 创建一个新的
PDOException
对象
- 抛出新异常
结果本身几乎没有用 - 特别是,步骤 4 和 5 可以替换为 throw $e
,这基本上意味着“我已经查看了这个异常,但认为它仍然是一个问题; 继续寻找另一个匹配的 catch
块”。如果您想在第 3 步和第 4 步之间执行某些操作(例如日志记录或清理),这有时会很有用。
如 it does remove the backtrace, which might otherwise expose credentials. That would be better handled by setting zend.exception_ignore_args=true in your PHP configuration. PHP 8.2 will also have a new facility that automatically hides certain parameters in backtraces.
您能解释一下 (PDOException $e) 和 PDOException($e->getMessage(), (int)$e->getCode()) 在这里的作用和含义吗?
try
{
$pdo = new PDO($attr, $user, $pass, $opts);
}
catch (PDOException $e)
{
throw new PDOException($e->getMessage(), (int)$e->getCode());
}
让我们比较这段代码使用和不使用 try catch 的输出
$pdo = new PDO('foo', 'username', 'password');
会给我们
PHP Fatal error: Uncaught PDOException: PDO::__construct():
Argument #1 ($dsn) must be a valid data source name in pdo.php:6
Stack trace:
#0 C:\SERVER\www\htdocs\pdo.php(6): PDO->__construct('foo', 'username', 'password')
#1 {main} thrown in pdo.php on line 6
注意用户名和密码可以在错误信息中看到
现在使用 try catch 和 re-throw
try
{
$pdo = new PDO('foo', 'username', 'password');
}
catch (PDOException $e)
{
throw new PDOException($e->getMessage(), (int)$e->getCode());
}
输出将是
PHP Fatal error: Uncaught PDOException: PDO::__construct():
Argument #1 ($dsn) must be a valid data source name in pdo.php:12
Stack trace:
#0 {main}
thrown in pdo.php on line 12
如您所见,没有用户名或密码。
这是使用如此笨拙代码的唯一原因
最好的起点是 the PHP manual page on Exceptions。
异常是一种强制错误处理机制 - 抛出异常会中止所有运行代码,而不是设置后续代码必须主动检查的标志一个匹配的 catch
块。如果没有找到 catch
块,则整个脚本退出。
catch
块使用与 the instanceof
operator 相同的逻辑进行匹配 - 你命名一个 class 或接口,异常必须是相同的 class,一个 sub-class,或实现该接口。然后你给一个变量名 - 在你的例子 $e
中,但它可以是你喜欢的任何名字 - 并且 PHP 将异常分配给该变量并运行 catch
块的内容。
创建 异常与创建任何其他对象相同 - 您使用 new
运算符。创建后,它们可以具有属性和方法,包括包含 getMessage()
和 getCode()
的默认集,这些 return 值是在最初构造时传递的。当您使用 throw
关键字时,它们会发生特殊行为。
因此,您显示的代码:
- 运行一些可能引发异常的代码 (
new PDO(...)
) - 捕获任何匹配
instanceof PDOException
的异常
- 在该异常对象上查找“消息”和“代码”
- 创建一个新的
PDOException
对象 - 抛出新异常
结果本身几乎没有用 - 特别是,步骤 4 和 5 可以替换为 throw $e
,这基本上意味着“我已经查看了这个异常,但认为它仍然是一个问题; 继续寻找另一个匹配的 catch
块”。如果您想在第 3 步和第 4 步之间执行某些操作(例如日志记录或清理),这有时会很有用。
如