Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Bloco using lançando exception

Fiz o bloco using e causei uma exceção dentro do construtor, porém a exceção finaliza o programa, não acontece igual a aula (implicitamente é tratado por um try e finally). O que fiz de errado?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp2 {
    class Program {
        public static void Main(string[] args) {
            using (File f = new File()) {
                f.teste();
            }

            Console.ReadKey();
        }
    }



    class File : IDisposable{
        public void Dispose() {
            Console.WriteLine("Fechei");
        }

        public File() {
            throw new System.IO.FileNotFoundException();
        }

        public void teste() {
            Console.WriteLine("testado");
        }
    }
}
2 respostas
solução!

Opa, Erick. Tudo bom?

O bloco using é um açúcar sintático para o try e finally. Seu código seria traduzido para algo como:

File f = null;

try
{
    f = new File();
    f.teste();
}
finally
{
    if (f != null)
    {
        f.Dispose();
    }
}

Note que não há tratamento da exceção com o bloco catch, então a exceção foi lançada e irá passar pela pilha de chamadas até algum método tratar este tipo de exceção ou finalizar a aplicação.

O que você acha? Esclareci sua dúvida?

Abs.

O construtor está lançando a exception System.IO.FileNotFoundException então não chega nem mesmo a criar o objeto a fim de chamar o método teste() comente a linha dentro do construtor ou remova ela que vai funcionar, vai aparecer no console: "testando" e "Fechei".

public File() {
            throw new System.IO.FileNotFoundException();
        }