Como: Tratar exceções em expressões de consulta (guia de programação translation from VPE for Csharp)

É possível telefonar qualquer método no contexto de uma expressão de consulta.No entanto, recomendamos que você evite chamar qualquer método em uma expressão de consulta que pode criar um efeito colateral sistema autônomo modificar o Sumário da fonte de dados ou gerar uma exceção.Este exemplo mostra como evitar disparar exceções ao chamar métodos em uma expressão de consulta sem violar o Geral .NET Framework diretrizes sobre manipulação de exceção. Estado essas diretrizes é aceitável para capturar uma exceção específica quando você compreende por que será lançada em um determinado contexto.Para obter mais informações, consulte Tratamento de exceção.

O exemplo final mostra como lidar com esses casos quando você deve lançar uma exceção durante a execução de uma consulta.

Exemplo

O exemplo a seguir mostra como mover o código fora de uma expressão de consulta de manipulação de exceção.Só é possível quando o método não depende de qualquer variável local para a consulta.

class ExceptionsOutsideQuery
{
    static void Main()
    {
        // DO THIS with a datasource that might
        // throw an exception. It is easier to deal with
        // outside of the query expression.
        IEnumerable<int> dataSource;
        try
        {
            dataSource = GetData();
        }
        catch (InvalidOperationException)
        {
            // Handle (or don't handle) the exception 
            // in the way that is appropriate for your application.
            Console.WriteLine("Invalid operation");
            goto Exit;
        }

        // If we get here, it is safe to proceed.
        var query = from i in dataSource
                    select i * i;

        foreach (var i in query)
            Console.WriteLine(i.ToString());

        //Keep the console window open in debug mode
        Exit:
        Console.WriteLine("Press any key to exit");
        Console.ReadKey();
    }

    // A data source that is very likely to throw an exception!
    static IEnumerable<int> GetData()
    {
        throw new InvalidOperationException();
    }
}

Em alguns casos, a melhor resposta a uma exceção é lançada de dentro de uma consulta pode ser a parar imediatamente a execução da consulta.O exemplo a seguir mostra como manipular exceções que podem ser lançadas dentro de um corpo de consulta.Suponha que SomeMethodThatMightThrow potencialmente pode causar uma exceção requer a execução da consulta para parar.

Observe que o try bloco inclui o foreach loop e não a própria consulta. Isso ocorre porque o foreach loop é o ponto em que a consulta é realmente executada. Para obter mais informações, consulte Introdução às consultas do LINQ.

class QueryThatThrows
{
    static void Main()
    {
        // Data source.
        string[] files = { "fileA.txt", "fileB.txt", "fileC.txt" };

        // Demonstration query that throws.
        var exceptionDemoQuery =
            from file in files
            let n = SomeMethodThatMightThrow(file)
            select n;

        // Runtime exceptions are thrown when query is executed.
        // Therefore they must be handled in the foreach loop.
        try
        {
            foreach (var item in exceptionDemoQuery)
            {
                Console.WriteLine("Processing {0}", item);
            }
        }

        // Catch whatever exception you expect to raise
        // and/or do any necessary claanup in a finally block
        catch (InvalidOperationException e)
        {
            Console.WriteLine(e.Message);
        }

        //Keep the console window open in debug mode
        Console.WriteLine("Press any key to exit");
        Console.ReadKey();
    }

    // Not very useful as a general purpose method.
    static string SomeMethodThatMightThrow(string s)
    {
        if (s[4] == 'C')
            throw new InvalidOperationException();
        return @"C:\newFolder\" + s;
    }
}
/* Output:
    Processing C:\newFolder\fileA.txt
    Processing C:\newFolder\fileB.txt
    Operation is not valid due to the current state of the object.
 */

Compilando o código

  • Criar um Visual Studio projeto que se destina a .NET estrutura versão 3.5. Por padrão, o projeto tem uma referência a sistema.Core.dll e um using diretiva para o namespace sistema.LINQ.

  • Copie o código em seu projeto.

  • Pressione F5 para compilar e executar o programa.

Pressione qualquer tecla para sair da janela do console.

Consulte também

Conceitos

Expressões de consulta do LINQ (guia de programação translation from VPE for Csharp)