Как обработать UnauthorizedAccessException в асинхронном коде? - PullRequest
0 голосов
/ 21 января 2020

Поймать UnauthorizedAccessException работает нормально, но это не так, когда я делаю File.WriteAllBytes -> await Task.Run(() => File.WriteAllBytes(Path + vid.FullName, vid.GetBytes())); Когда я делаю это, исключение не ловится. Какой лучший способ поймать это исключение, чтобы отображался MessageBox? Спасибо.

(ПРИМЕЧАНИЕ. Этот код явно конвертер YouTube, но он предназначен для моего личного использования )

 public async Task ConvertVideoAndDownloadToFolder(string link, string MP3Name = null)
        {
            try
            {
                var youtube = YouTube.Default;
                var vid = await Task.Run(() => youtube.GetVideo(link));
                await Task.Run(() => File.WriteAllBytes(Path + vid.FullName, vid.GetBytes()));
                var inputFile = new MediaFile { Filename = Path + vid.FullName };
                MediaFile outputFile;
                //Creates mp4 and mp3
                if (String.IsNullOrEmpty(MP3Name)) { outputFile = new MediaFile { Filename = $"{Path + vid.FullName}.mp3" }; }
                //only creates MP4
                else { outputFile = new MediaFile { Filename = $"{MP3Name}.mp3" }; }

                using (var engine = new Engine())
                {
                    await Task.Run(() => engine.GetMetadata(inputFile));

                    await Task.Run(() => engine.Convert(inputFile, outputFile));
                }
            }
            catch (Exception ex)
            {
                if(ex is UnauthorizedAccessException)
                {
                    MessageBox.Show($"Can't write on '{Path}' as it is protected.\rPlease choose another folder. ", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
                }
                else if(ex is ArgumentException)
                {
                    MessageBox.Show($"'{link}' is not a valid YouTube link, \rMake sure the video still works, or check the link for typos. ", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
                }
                else
                {
                    throw;
                }
            }
        }

1 Ответ

1 голос
/ 19 февраля 2020

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

AggregateException хранит все исключения, возникающие в разных потоках, и поэтому вы не потеряете ни одно исключение


catch (AggregateException aex)
{
     foreach(var ex in aex.InnerExceptions) //This will consolidate t
     {
         Console.WriteLine(ex.Message);
     }
 } 

Ссылка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...