Os erros e o processamento de erros representam uma classe de API. Erros relacionados com o processamento de erros são tão comuns que merecem um domínio próprio. Assim como no “abuso de API”, há duas formas de introduzir uma vulnerabilidade de segurança relacionada com erros. A primeira, e mais comum, é processar os erros indevidamente (ou não os processar). A segunda é produzir erros que revelem muitas informações (a possíveis invasores) ou que sejam difíceis de processar.
NullPointerException
é uma prática imprópria.NullPointerException
em três circunstâncias:NullPointerException
para sinalizar uma condição de erro.NullPointerException
por engano.
try {
mysteryMethod();
}
catch (NullPointerException npe) {
}
NullReferenceException
é uma prática imprópria.NullReferenceException
em três circunstâncias:NullReferenceException
para sinalizar uma condição de erro.NullReferenceException
por engano.
try {
MysteryMethod();
}
catch (NullReferenceException npe) {
}
finally
fará com que exceções sejam perdidas.finally
fará com que qualquer exceção que possa ser lançada no bloco "try" seja descartada.MagicException
lançada pela segunda chamada para doMagic
com true
transmitido para ela nunca será entregue para o chamador. A instrução de retorno dentro do bloco finally
fará com que a exceção seja descartada.
public class MagicTrick {
public static class MagicException extends Exception { }
public static void main(String[] args) {
System.out.println("Watch as this magical code makes an " +
"exception disappear before your very eyes!");
System.out.println("First, the kind of exception handling " +
"you're used to:");
try {
doMagic(false);
} catch (MagicException e) {
// An exception will be caught here
e.printStackTrace();
}
System.out.println("Now, the magic:");
try {
doMagic(true);
} catch (MagicException e) {
// No exception caught here, the finally block ate it
e.printStackTrace();
}
System.out.println("tada!");
}
public static void doMagic(boolean returnFromFinally)
throws MagicException {
try {
throw new MagicException();
}
finally {
if (returnFromFinally) {
return;
}
}
}
}
finally
fará com que exceções sejam perdidas.finally
fará com que qualquer exceção que possa ser lançada no bloco "try" seja descartada.exception
lançada pela segunda chamada para doMagic
com True
transmitido para ela nunca será entregue para o chamador. A instrução de retorno dentro do bloco finally
fará com que a exceção seja descartada."disappear before your very eyes!" . PHP_EOL;
echo "First, the kind of exception handling " .
"you're used to:" . PHP_EOL;
try {
doMagic(False);
} catch (exception $e) {
// An exception will be caught here
echo $e->getMessage();
}
echo "Now, the magic:" . PHP_EOL;
try {
doMagic(True);
} catch (exception $e) {
// No exception caught here, the finally block ate it
echo $e->getMessage();
}
echo "Tada!" . PHP_EOL;
function doMagic($returnFromFinally) {
try {
throw new Exception("Magic Exception" . PHP_EOL);
}
finally {
if ($returnFromFinally) {
return;
}
}
}
?>
ThreadDeath
não for lançado novamente, o thread em questão não poderá realmente ser desativado.ThreadDeath
só devem ser capturados se um aplicativos precisar de uma limpeza depois de ter sido finalizado de forma assíncrona. Se um erro ThreadDeath
for capturado, é importante que ele seja novamente lançado para que o thread realmente seja desativado. O objetivo de lançar ThreadDeath
é interromper um thread. Se ThreadDeath
for engolido, ele poderá impedir que um thread seja interrompido e resultar em um comportamento inesperado, pois, quem quer que tenha lançado ThreadDeath
originalmente, espera que o thread seja interrompido.ThreadDeath
, mas não volta a lançá-lo.
try
{
//some code
}
catch(ThreadDeath td)
{
//clean up code
}
throw
dentro de um bloco finally
rompe a progressão lógica via try-catch-finally
.finally
são sempre executados depois de seus blocos try-catch
correspondentes e são frequentemente utilizados para liberar recursos alocados, como identificadores de arquivos ou cursores de banco de dados. Lançar uma exceção em um bloco finally
pode ignorar o código de limpeza crítico, pois a execução normal do programa será interrompida.stmt.close()
é ignorada quando a FileNotFoundException
é lançada.
public void processTransaction(Connection conn) throws FileNotFoundException
{
FileInputStream fis = null;
Statement stmt = null;
try
{
stmt = conn.createStatement();
fis = new FileInputStream("badFile.txt");
...
}
catch (FileNotFoundException fe)
{
log("File not found.");
}
catch (SQLException se)
{
//handle error
}
finally
{
if (fis == null)
{
throw new FileNotFoundException();
}
if (stmt != null)
{
try
{
stmt.close();
}
catch (SQLException e)
{
log(e);
}
}
}
}
javax.net.ssl.SSLHandshakeException
, javax.net.ssl.SSLKeyException
e javax.net.ssl.SSLPeerUnverifiedException
transmitem erros importantes relacionados a uma conexão SSL. Se esses erros não forem tratados explicitamente, a conexão poderá ser deixada em um estado inesperado e potencialmente inseguro.