Exeptions


php128 apg

Exeptions are invalid situations that occur during regular processing that prevent the flow from continuing normally until the situation is somehow resolved.

In PHP we are faced with an exception model similar to other programming languages.



throw


Instruction to throw an exception.



Throwable


Throwable is the base interface for any object that can be thrown via a throw statement including Error and Exception.

PHP classes cannot implement the Throwable interface directly, and must instead extend Exception.



<?=

Exception 
implements Throwable {
/* Properties */
protected string $message ;
protected 
int $code ;
protected 
string $file ;
protected 
int $line ;
/* Methods */
public __construct ([ string $message "" [, int $code [, Throwable $previous NULL ]]] )
final public 
getMessage void ) : string
final public getPrevious void ) : Throwable
final public getCode void ) : mixed
final public getFile void ) : string
final public getLine void ) : int
final public getTrace void ) : array
final public 
getTraceAsString void ) : string
public __toString void ) : string
final private __clone void ) : void
}

?>

<?=

Throwable 
{
/* Methods */
abstract public getMessage void ) : string
abstract public getCode void ) : int
abstract public getFile void ) : string
abstract public getLine void ) : int
abstract public getTrace void ) : array
abstract public 
getTraceAsString void ) : string
abstract public getPrevious void ) : Throwable
abstract public __toString void ) : string
}

?>

<?=

Error 
implements Throwable {
/* Properties */
protected string $message ;
protected 
int $code ;
protected 
string $file ;
protected 
int $line ;
/* Methods */
public __construct ([ string $message "" [, int $code [, Throwable $previous NULL ]]] )
final public 
getMessage void ) : string
final public getPrevious void ) : Throwable
final public getCode void ) : mixed
final public getFile void ) : string
final public getLine void ) : int
final public getTrace void ) : array
final public 
getTraceAsString void ) : string
public __toString void ) : string
final private __clone void ) : void
}

?>

catch


Exception catch instruction.



finally


In PHP 5.5 and later, a finally block may also be specified after or instead of catch blocks.



try


Code may be surrounded in a try block where the code can be placed to facilitate the catch of potential exceptions.

Each try must have at least one corresponding catch or finally block.



  1 EXERCISE   

<?php

function inverse($x) {
    if (!
$x) {
        throw new 
Exception('<br>Division by zero.');
    }
    return 
"1/$x = "1/$x;
}

$v1a 5;
$v1b 0;

try {
    echo 
inverse($v1a) . "<br>";
    echo 
inverse($v1b) . "<br>";
} catch (
Exception $e) {
    echo 
'<br>Caught exception: ',  $e->getMessage(), "<br><br>";
    echo 
'Previous: ' $e->getPrevious(), "<br><br>Code:<br>";
    
print_r ($e->getCode());
    echo 
"<br><br>";
    echo 
'File:<br>' $e->getFile(), "<br><br>";
    echo 
'Line:<br>' $e->getLine(), "<br><br>Trace Array:<br>";
    
    
var_dump($e->getTrace());
    echo 
"<br><br>";
    echo 
'Trace AsString:<br>' $e->getTraceAsString();
    echo 
"<br><br>";    
}
    

// Continue execution
echo "For now, that's all!<br>";

?>

  1 EXERCISE   

<?php

/*
 * To run this exercise simultaneously with the first, 
 * you will need to change the function name.
 
 * If this is not done, the flow will be 
 * interrupted by a Fatal error.
*/

function inverse($x) {
    if (!
$x) {
        throw new 
Exception('<br>Division by zero.');
    }
    return 
"1/$x = "1/$x;
}

$v1a 5;
$v1b 3;

try {
    echo 
inverse($v1a) . "<br>";
    echo 
inverse($v1b) . "<br>";
} catch (
Exception $e) {
    echo 
'<br>Caught exception: ',  $e->getMessage(), "<br><br>";
    echo 
'Previous: ' $e->getPrevious(), "<br><br>Code:<br>";
    
print_r ($e->getCode());
    echo 
"<br><br>";
    echo 
'File:<br>' $e->getFile(), "<br><br>";
    echo 
'Line:<br>' $e->getLine(), "<br><br>Trace Array:<br>";
    
    
var_dump($e->getTrace());
    echo 
"<br><br>";
    echo 
'Trace AsString:<br>' $e->getTraceAsString();
    echo 
"<br><br>";    
}
    

// Continue execution
echo "For now, that's all!<br>";

?>