Como: tratar exceções em expressões de consulta (guia de programação do C#)

É possível chamar 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 como modificar o conteúdo da fonte de dados ou gerar uma exceção.Este exemplo mostra como evitar gerar exceções ao chamar métodos em uma expressão de consulta sem violar geral .NET Framework obter diretrizes sobre a manipulação de exceção.Estado essas diretrizes é aceitável para capturar uma exceção específica quando compreender por que ela será lançada em um determinado contexto.Para obter mais informações, consulte As práticas recomendadas para o tratamento de exceções.

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.Isso 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, pode ser a melhor resposta a uma exceção que é lançada a partir de dentro de uma consulta interromper a execução da consulta imediatamente.O exemplo a seguir mostra como manipular exceções que podem ser geradas de dentro de um corpo de consulta.Suponha que SomeMethodThatMightThrow pode causar uma exceção que 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 (C#).

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 cleanup 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 o projeto que se destina a.NET Framework versão 3.5.Por padrão, o projeto tem uma referência a System.Core.dll e um using diretriz para o namespace System. 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 do C#)