내보내기(0) 인쇄
모두 확장
이 문서는 기계로 번역한 것입니다. 원본 텍스트를 보려면 포인터를 문서의 문장 위로 올리십시오. 추가 정보
번역
원본

방법: 작업에서 throw된 예외 처리

다음 예제에서는 하나 이상의 작업에서 throw된 예외를 처리하는 방법을 보여 줍니다.

첫째 예제에서는 System.AggregateException을 catch한 다음 해당 InnerExceptions를 검사하여 프로그램 코드에서 처리할 수 있는 예외가 있는지 여부를 확인합니다.



static string[] GetAllFiles(string str)
{
    // Should throw an AccessDenied exception on Vista.
    return System.IO.Directory.GetFiles(str, "*.txt", System.IO.SearchOption.AllDirectories);
}
static void HandleExceptions()
{
    // Assume this is a user-entered string.
    string path = @"C:\";

    // Use this line to throw UnauthorizedAccessException, which we handle.
    Task<string[]> task1 = Task<string[]>.Factory.StartNew(() => GetAllFiles(path));

    // Use this line to throw an exception that is not handled.
    //  Task task1 = Task.Factory.StartNew(() => { throw new IndexOutOfRangeException(); } );
    try
    {
        task1.Wait();
    }
    catch (AggregateException ae)
    {

        ae.Handle((x) =>
        {
            if (x is UnauthorizedAccessException) // This we know how to handle.
            {
                Console.WriteLine("You do not have permission to access all folders in this path.");
                Console.WriteLine("See your network administrator or try another path.");
                return true;
            }
            return false; // Let anything else stop the application.
        });

    }

    Console.WriteLine("task1 has completed.");
}


이 예제에서는 System.AggregateException을 catch하지만 내부 예외는 처리하지 않습니다. 대신 Flatten 메서드를 사용하여 중첩된 AggregateException 인스턴스에서 내부 예외를 추출하고 처리되지 않은 모든 내부 예외를 직접 포함하는 단일 AggregateException을 다시 throw합니다. 예외를 평면화하면 예외를 보다 편리하게 자식 코드에서 처리할 수 있습니다.


static string[] GetValidExtensions(string path)
{
    if (path == @"C:\")
        throw new ArgumentException("The system root is not a valid path.");

    return new string[10];
}
static void RethrowAllExceptions()
{
    // Assume this is a user-entered string.
    string path = @"C:\";


    Task<string[]>[] tasks = new Task<string[]>[3];
    tasks[0] = Task<string[]>.Factory.StartNew(() => GetAllFiles(path));
    tasks[1] = Task<string[]>.Factory.StartNew(() => GetValidExtensions(path));
    tasks[2] = Task<string[]>.Factory.StartNew(() => new string[10]);


    //int index = Task.WaitAny(tasks2);
    //double d = tasks2[index].Result;
    try
    {
        Task.WaitAll(tasks);
    }
    catch (AggregateException ae)
    {
        throw ae.Flatten();
    }

    Console.WriteLine("task1 has completed.");
}


이 예제를 실행하려면 앞의 예제에 코드를 붙여넣고 Main 메서드에서 RethrowAllExceptions를 호출합니다.

커뮤니티 추가 항목

추가
Microsoft는 MSDN 웹 사이트에 대한 귀하의 의견을 이해하기 위해 온라인 설문 조사를 진행하고 있습니다. 참여하도록 선택하시면 MSDN 웹 사이트에서 나가실 때 온라인 설문 조사가 표시됩니다.

참여하시겠습니까?
표시:
© 2014 Microsoft