Req #67860 [Opn]: Throw an "acceptable" exception
| From: | david dot proweb at gmail dot com | Date: | Tue, 19 Aug 2014 19:52:02 +0000 |
| Subject: | Req #67860 [Opn]: Throw an "acceptable" exception | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-187189@lists.php.net to get a copy of this message | ||
Edit report at https://bugs.php.net/bug.php?id=67860&edit=1
ID: 67860
User updated by: david dot proweb at gmail dot com
Reported by: david dot proweb at gmail dot com
Summary: Throw an "acceptable" exception
Status: Open
Type: Feature/Change Request
Package: *General Issues
Operating System: Irrelevant
PHP Version: Irrelevant
Block user comment: N
Private report: N
New Comment:
Your example can handle that, fine.
But imagine that:
I'm developing a framework, and it have a method that return current URL, but check if it is
secure too (I don't know what user will do with that), but, even if not, the execution will
works normally (user need check that, or I need to develop a method that check it
"manually").
With this option, I can thrown a casual exception, but not fatal. User can check that or just
ignore. It'll depends if user really want to capture this exception. Supposing that he is just
logging user URL, for instance.
$log->url = Framework::getCurrentUrl();
$log->save();
In this case, I not need capture the exception, I just not need to check security on URL.
Now, if user need to avoid bad URLs, I can do that:
try { $user->url = Framework::getCurrentUrl(); }
catch(BadURL_Exception $e) {
echo "Sorry, your URL is insecure.";
return false;
}
To uncaptured exception, PHP can show a notice error, that can be hidden on error_reporting() or
INI;
Previous Comments:
------------------------------------------------------------------------
[2014-08-19 19:34:56] salathe@php.net
The described behaviour can already be done.
<?php
set_error_handler(function ($errno, $errstr, $errfile, $errline) {
throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
});
try {
echo $variable;
} catch (Exception $e) {
echo "D'oh! " . $e->getMessage();
}
?>
Outputs:
D'oh! Undefined variable: variable
Alternatively, you could always write sensible code that doesn't raise notices.
------------------------------------------------------------------------
[2014-08-19 01:56:05] david dot proweb at gmail dot com
Actually it would make errors in a casual exception, so that I could capture it in a more reliable
manner.
$variable = [1, 2, 3];
echo $variable;
// Notice: Array to string conversion.
How I can capture that? (In this case, I could avoid it by checking if the variable is compatible,
but it is only an example.)
With the feature, I could do:
try { echo $variable; }
catch(Exception $e) {
if(strpos($e->getMessage(), "Array to string conversion")) {
echo "Check option
user_type, it accept only string.";
}
}
------------------------------------------------------------------------
[2014-08-19 01:49:21] requinix@php.net
If you don't want to deal with exceptions then don't use them in your code.
------------------------------------------------------------------------
[2014-08-19 01:13:31] david dot proweb at gmail dot com
Description:
------------
Imagine that you do ($a / $b), but $b is zero.
So you will receives "Warning: Division by zero.".
You can avoid that by doing @($a / $b), something like that.
But imagine if PHP can thrown an exception that not need be captured.
It is: you can, optionally, capture that, but if not, will only thrown a notice, instead of warning.
// Supposing that it is the PHP division constructor:
function php_div($a, $b) {
if($b === 0) {
throw casual new Exception("Division by zero.");
}
return $a / $b;
}
// So if I do:
5 / 0; // Notice: Division by zero.
// But I can do:
try { 5 / 0; }
catch(Exception $e) { ... } // Avoid notice.
// Or even:
@(5 / 0); // Avoid casual Exception.
--
User can throw casual exceptions too.
For instance:
function name_fix($name) {
...
if(name_uncommon($name)) {
throw casual new Exception("This name is uncommon.");
}
...
return $name_fixed;
}
echo name_fix("David"); // David
echo name_fix("Hakuna Matata"); // Hakuna Matata + Notice
// When you capture that, statement will be blocked.
try { echo name_fix("Hakuna Matata"); }
catch(Exception $e) { echo "The Hakuna Matata is so uncommon."; }
// -> The Hakuna Matata is so uncommon. (not echo name, not notice)
--
Exception need a new property like boolean $isCasual ($e->isCasual()).
--
Note: apply it to "division by zero" is only to examplify my feature request.
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=67860&edit=1