Partilhar via


How to: Tratar exceções em expressões de consulta (C# guia de programação)

É 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 disparar exceções ao chamar métodos em uma expressão de consulta sem violar geral .NET Framework diretrizes no tratamento de exceção. Estado essas diretrizes é aceitável para capturar uma exceção específica quando compreender 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, 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 do corpo de uma 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 projetoVisual Studio 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 a diretiva para o namespace System. LINQ.

  • Copie o código para o seu projeto.

  • Pressione F5 para compilar e executar o programa.

Pressione qualquer tecla para sair da janela do console.

Consulte também

Conceitos

LINQ Expressões de consulta (guia de programação de C#)