Sdílet prostřednictvím


Jak: popisovač výjimky ve výrazech dotazu (Příručka programování C#)

Je možné volat jakékoliv metody v kontextu výrazu dotazu.Doporučujeme však zabránit voláním jakékoli metody ve výrazu dotazu, můžete vytvořit vedlejším účinkem, jako je například úprava obsahu zdroje dat nebo došlo k výjimce.Tento příklad ukazuje, jak se vyhnout při volání metody ve výrazu dotazu bez porušení obecné zvýšení výjimky .NET Framework pokyny pro zpracování výjimek.Tyto pokyny stav, který je přijatelný zachytit zvláštní výjimku při pochopit, proč bude vyvolána v daném kontextu.Další informace naleznete v tématu Doporučené postupy pro zpracování výjimek.

Poslední příklad ukazuje, jak zpracovat případy musí vyvolat výjimku při spuštění dotazu.

Příklad

Následující příklad ukazuje, jak přesunout mimo výrazu dotazu kód zpracování výjimek.To je možné pouze v případě, že metoda není závislá na všech proměnných dotazu místní.

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

V některých případech může být nejlepší odpověď na výjimku, která je vyvolána z v dotazu okamžité zastavení zpracování dotazu.Následující příklad ukazuje způsob zpracování výjimek, které může být vyvolána z uvnitř těla dotazu.Předpokládejme, že SomeMethodThatMightThrow může způsobit výjimku, která vyžaduje spuštění dotazu zastavit.

Všimněte si, že try bloku ohraničuje foreach smyčky a nikoli samotný dotaz.Důvodem je, že foreach smyčky je bod, kdy dotaz skutečně provedeny.Další informace naleznete v tématu Úvod do LINQ dotazy (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.
 */

Probíhá kompilace kódu

  • Vytvoření Visual Studio projektu, který se zaměřuje.NET Framework verze 3.5.Ve výchozím nastavení projektu odkazuje na System.Core.dll a using směrnice pro obor názvů System.Linq.

  • Zkopírujte kód do projektu.

  • Stisknutím klávesy F5 sestavit a spustit program.

Stisknutím libovolné klávesy uzavřete okno konzoly.

Viz také

Koncepty

LINQ dotazu výrazy (Příručka programování C#)