Porady: obsługa wyjątków w wyrażeniach kwerend (Przewodnik programowania w języku C#)

Istnieje możliwość wywołania dowolnej metody w kontekście wyrażenie kwerendy.Jednak zaleca się, aby uniknąć wywołaniem jakiejkolwiek jego metody w wyrażeniu kwerendy, którą można utworzyć efekt uboczny, takie jak modyfikacja zawartość źródła danych lub zgłaszanie wyjątku.Ten przykład przedstawia sposób uniknąć podnoszenie wyjątki podczas wywołania metody w wyrażeniu kwerendy bez naruszania ogólne .NET Framework wytyczne dotyczące obsługi wyjątków.Stan tych wytycznych jest dopuszczalne do połowu określonego wyjątek podczas zrozumieć, dlaczego będzie zostać wygenerowany w danym kontekście.Aby uzyskać więcej informacji, zobacz Najlepsze praktyki dotyczące wyjątków.

Końcowy przykład pokazuje, jak obsługiwać te przypadki, gdy musi zgłosić wyjątek podczas wykonywania kwerendy.

Przykład

Poniższy przykład pokazuje, jak przenieść kodu poza wyrażenie kwerendy obsługi wyjątków.Jest to możliwe tylko wtedy, gdy metoda nie zależy od wszelkich zmiennych lokalnych do kwerendy.

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();
    }
}

W niektórych przypadkach może być natychmiast zatrzymać wykonywanie kwerendy najlepszą odpowiedź na wyjątek, który wygeneruje w ciągu kwerendy.Poniższy przykład pokazuje sposób obsługi wyjątków, które może zostać wygenerowany z wewnątrz ciała kwerendy.Załóżmy, że SomeMethodThatMightThrow potencjalnie może spowodować wyjątek, który wymaga, aby zatrzymać wykonywanie kwerendy.

Należy zauważyć, że try umieszcza blok foreach pętli, a nie samą kwerendę.Wynika to z foreach pętli jest punktem, w którym faktycznie wykonywane kwerendy.Aby uzyskać więcej informacji, zobacz Wprowadzenie do kwerend 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.
 */

Kompilowanie kodu

  • Tworzenie Visual Studio projekt, który jest przeznaczony.NET Framework w wersji 3.5.Domyślnie projekt zawiera odwołanie do System.Core.dll i using dyrektywa obszaru nazw System.Linq.

  • Skopiuj kod do projektu.

  • Naciśnij klawisz F5, aby skompilować i uruchomić program.

Naciśnij dowolny klawisz, aby zamknąć okno konsoli.

Zobacz też

Koncepcje

Wyrażenia kwerend LINQ (Przewodnik programowania w języku C#)