Não vá dizer que Exception é o mesmo que Erro !

O que é Exception e o que é Erro ?

Sabemos que uma Exception é bem diferente de um Error não só sintaticamente falando, mas semanticamente também, vejamos.

Segundo o Dicionário:

Exceção

Ruptura de uma regra ou norma; desvio de um padrão estabelecido; rompimento do que se considera normal: não há regra sem exceção. Que não pertence ao todo: todos chegaram com exceção do filho. Estado ou circunstância fora do comum: vantajosas eram as exceções. Figurado. Pessoa cujo modo de pensar ou de proceder não é comum. Jurídico. Mecanismo de proteção, ou de defesa, utilizado pelo réu com o propósito de anular os poderes do autor da ação ou de atrasar o seu prosseguimento. Indivíduo que não respeita, ou rejeita, normas, padrões e regras. Ação ou efeito de excetuar, de excluir.

Erro

É uma consequência de uma ação inesperada, sem planejamento, conhecimento. Pode ser uma falha humano ou por equipamento.


No nosso mundo um bloco try catch é como um bloco “protegido” de falhas.

Sendo mais direto quero dizer que quando ocorrer um problema no TRY a execução do código irá desviar para a instrução CATCH

Sintax básica

try {
  //Meus comandos
}
catch (Exception e) {
 //Meu tratamento de exceção
}

Legal agora que sabemos a diferença, vamos a alguns exemplos, vou começar primeiro pelo Erro:

<?php
function dividir($num1, $num2) {
    return $num1/$num2;
}

echo dividir(5,3) //Saída - Fatal Error (pois  falta o ";")
echo div(5,3); //Saída - Fatal Error (pois não definimos a função "div")
?>

Pronto, bem simples demonstrar um erro.

Agora vamos as Exceções (Exceptions)

Vamos pensar numa função de dividir dois números, essa função recebe 2 parametros que são os números a serem divididos.

<?php
function dividir($num1, $num2) {
    if (!$num2) {
        throw new Exception('Não é possvél realizar a divisão por zero');
    }
    return $num1/$num2;
}


try {
    echo dividir(5,3); // Saída 1.6666666666667
    echo dividir(3,0); // Saída - Não é possvél realizar a divisão por zero
} catch (Exception $e) {
    echo 'Exceção: '.  $e->getMessage();
}
?>

Legal né :)

Agora vamos a um exemplo sem Try Catch

<?php
function dividir($num1, $num2) {
    return $num1/$num2;
}

echo dividir(5,3); // Saída 1.6666666666667
echo dividir(3,0); // Saída - Warning:  Division by zero
?>

Perceba que agora a mensagem foi diferente da que adotamos no primeiro exemplo, vamos entender o motivo.

Quando dividimos dois números inteiros uma função chamada intdiv é chamada.

Olhando mais a fundo AQUI logo nas últimas linhas vamos encontrar algo assim:

PHP_FUNCTION(intdiv)
{
  zend_long numerator, divisor;
  if (zend_parse_parameters(ZEND_NUM_ARGS(), "ll", &numerator, &divisor) == FAILURE) {
    return;
  }
  if (divisor == 0) {
    zend_throw_exception_ex(zend_ce_division_by_zero_error, 0, "Division by zero");
    return;
  } else if (divisor == -1 && numerator == ZEND_LONG_MIN) {
    /* Prevent overflow error/crash ... really should not happen:
       We don't return a float here as that violates function contract */
    zend_throw_exception_ex(zend_ce_arithmetic_error, 0, "Division of PHP_INT_MIN by -1 is not an integer");
    return;
  }

  RETURN_LONG(numerator / divisor);
}

A função intdiv que está em (ext/standard/math.c) é responsavél por dividir 2 numeros interiros e caso o divisor seja igual a zero ele lança sua Exception

zend_throw_exception_ex(zend_ce_division_by_zero_error, 0, "Division by zero");

Tray Catch em outras linguagens:

JavaScript

function dividir(n1, n2){
  if(n2 == 0) throw "Divisão por zero não é possivel";
  return n1/n2;
}

try {
    var result = dividir(2,0);
}
catch(err) {
    console.log(err)
}

Ruby

[Colocar Exemplo]

Python

[Colocar Exemplo]