Почему C # не вызывает исключение, которое произошло внутри локальной функции асинхронной функции? - PullRequest
0 голосов
/ 21 мая 2018

Я получил эту функцию:

public async Task<bool> TryPlayElseStop(int reciterId, int chapterId) {
    this.chapterId = chapterId;
    var file = await RecitationUtils.TryGetAudioFile(reciterId, chapterId);
    if (file != null) {
        Play(file); // there should be an exception thrown here
        return true;
    } else {
        Utils.Toast("Download the file first in the Recitation menu");
        Stop();
        return false;
    }
}

private void Play(Tuple<MyFile, RealmRecitationFile> file) {
    if (mediaPlayer == null)
        InitMediaPlayer();
    ResetCallbacks();
    mediaPlayer.SetSource(file.Item1);
    FileCurrentlyPlaying = file.Item2;
    AppUtils.UpdateListeningHistory(chapterId);
    UiClients.ForEach(x => x.OnSurahPlayed(chapterId));

    void InitMediaPlayer() {
        mediaPlayer = new MyMediaPlayer {IsLoopingEnabled = false};
        // the app continues even though I'm explicitly 
        // throwing this exception for debugging purposes
        throw new NullReferenceException(); 
        playerTimer = new MyTimer(1_000); // the actual exception occurs inside this constructor
        playerTimer.Start();
        UiClients.ForEach(x => x.OnPlayerInitialized());
    }

    // ...
}

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

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

1 Ответ

0 голосов
/ 21 мая 2018

Когда я вызываю метод TryPlayElseStop, должно возникать исключение NullReferenceException.

Нет, когда вы вызываете метод TryPlayElseStop, он должен вернуть ошибочную задачу.Метод, объявленный с модификатором async never , генерирует исключение синхронно, даже если он попадает в исключение при синхронном выполнении (до первого ожидания, которое должно "остановиться").

Вы не показали, как вызывается TryPlayElseStop, но либо ожидаете возвращенную задачу, либо вызываете Wait() или Result для нее вызовет исключение (предполагая, что Play само вызывает исключение какВы прокомментировали).Возможно, вы нигде не ожидаете результата TryPlayElseStop? 1018 *

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