Как исправить перехват TimeoutException?

Как я могу поймать TimeoutException?

Я хочу поймать TimeoutException через 3 секунды. Но через 3 секунды он выводит TimeoutException, тогда как ожидается It's too long. Timeout!.

С console application не ловит TimeoutException.

public static void work()
{
    Thread.Sleep(3000);
    Console.WriteLine("TimeoutException");
    throw new TimeoutException();
}

public static void Main(string[] args)
{
    try
    {
        ThreadStart th = new ThreadStart(work);
        Thread t = new Thread(th);
        t.Start();
        //Execute SearchProgram
        t.Abort();
    }
    catch (ThreadInterruptedException)
    {
        Console.WriteLine("It's too long. Timeout!");
    }

    Console.WriteLine("Result : ~~~");
}

person OBO    schedule 29.07.2019    source источник
comment
Вы ловите ThreadInterruptedException, а не TimeoutException   -  person MindSwipe    schedule 29.07.2019
comment
Вы добавили TimeoutException(); в свой метод work и ожидаете поймать ThreadInterruptedException?   -  person SᴇM    schedule 29.07.2019


Ответы (2)


Как уже говорили другие, вы не поймаете хорошее исключение. Но это не ожидаемый ответ, так как ошибку одного потока нельзя поймать из другого.

Есть несколько способов справиться с этим случаем, которые можно найти в этом ответе.

Пример для вашего случая:

public static void work()
{
    Thread.Sleep(3000);
    Console.WriteLine("TimeoutException");
    throw new TimeoutException();
}

public static void Main(string[] args)
{
    Thread thread = new Thread(() => SafeExecute(() => work(), Handler));
    thread.Start();

    Console.WriteLine("Result : ~~~");
    Console.ReadLine();
}

private static void Handler(Exception exception)
{
    Console.WriteLine(exception);
}

private static void SafeExecute(Action test, Action<Exception> handler)
{
    try
    {
        test.Invoke();
    }
    catch (TimeoutException ex)
    {
        Console.WriteLine("It's too long. Timeout!");
    }
    catch (Exception ex)
    {
        Handler(ex);
    }
}
person Guilhem Prev    schedule 29.07.2019

Вероятно, вы ловите неправильное исключение. Согласно документации Microsoft (https://docs.microsoft.com/fr-fr/dotnet/api/system.timeoutexception?view=netframework-4.8) вы должны поймать класс TimeOutException.

person taktak    schedule 29.07.2019