Нет исключений в асинхронном методе - PullRequest
0 голосов
/ 13 марта 2019

Кажется, я не могу выбросить исключение в асинхронных методах:

void Start ()
{
    ReadAndThrow(null);
}

public static async Task ReadAndThrow(string path)
{
    if(string.IsNullOrEmpty(path) == true) 
    { 
         Debug.Log("Wrong"); 
         throw new Exception("Wrong"); 
    }
    using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read))
    {
        using (StreamReader reader = new StreamReader(fs, Encoding.UTF8))
        {
            string line = null;
            while ((line = await reader.ReadLineAsync()) != null) { }
        }
    }
}

При этом я вижу отладку, но исключение не печатается в консоли. Это действительно останавливает приложение, в основном, исключение происходит, но не печатается в консоли.

Я могу использовать попытку перехватить и распечатать ошибку, но почему исключение исключено из консоли? Это не показывает в разделе ошибок, я проверил, я пропустил бы его оттуда.

Как я могу получить исключение для печати?

EDIT:

Последний использованный код, не печатается:

async Task Start()
{
    await ReadAndThrow(null);
}
async Task ReadAndThrow(string path)
{
    Debug.Log("Start");
    try
    {
        if (string.IsNullOrEmpty(path) == true) { Debug.Log("Wrong"); throw new Exception("Wrong in"); }
    }catch(Exception e)
    {
        Debug.Log("Method" + e.Message);
        throw;
    }
    using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read))
    {
        using (StreamReader reader = new StreamReader(fs, Encoding.UTF8))
        {
            string line = null;
            while ((line = await reader.ReadLineAsync()) != null)
            {

            }
        }
    }
}

Ответы [ 3 ]

3 голосов
/ 13 марта 2019

ReadAndThrow закончится до того, как будет напечатано исключение. Нужно awai т.

0 голосов
/ 13 марта 2019

Исправления необходимо сделать, чтобы заставить его работать.Волшебство заключается в том, что вам нужно дождаться окончания ReadAndThrow.Также рекомендую прочитать https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/async/

public Task StartAsync ()
{
    return ReadAndThrow(null); //and await StartAsync method
    //or
    await ReadAndThrow(); // do not forget to make method async 
}
0 голосов
/ 13 марта 2019

Вам необходимо await свой метод, изменив подпись Start() метод

async Task Start()
{
    await ReadAndThrow(null);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...