как правильно обрабатывать исключения async? [Дубликат]

Можно использовать аннотацию Apache @Model для создания классов модели Java, представляющих структуру файлов JSON, и использовать их для доступа к различным элементам дерева JSON. В отличие от других решений эта работает полностью без отражения и поэтому подходит для сред, где отражение невозможно или имеет значительные накладные расходы.

Существует образец проекта Maven , показывающий использование. Прежде всего он определяет структуру:

@Model(className="RepositoryInfo", properties = {
    @Property(name = "id", type = int.class),
    @Property(name = "name", type = String.class),
    @Property(name = "owner", type = Owner.class),
    @Property(name = "private", type = boolean.class),
})
final class RepositoryCntrl {
    @Model(className = "Owner", properties = {
        @Property(name = "login", type = String.class)
    })
    static final class OwnerCntrl {
    }
}

, а затем использует сгенерированные классы RepositoryInfo и Owner для анализа предоставленного входного потока и выбора определенной информации при этом:

List repositories = new ArrayList<>();
try (InputStream is = initializeStream(args)) {
    Models.parse(CONTEXT, RepositoryInfo.class, is, repositories);
}

System.err.println("there is " + repositories.size() + " repositories");
repositories.stream().filter((repo) -> repo != null).forEach((repo) -> {
    System.err.println("repository " + repo.getName() + 
        " is owned by " + repo.getOwner().getLogin()
    );
})

Вот и все! В дополнение к этому здесь live gist показывает аналогичный пример вместе с асинхронной сетевой связью.

13
задан ForceMagic 25 February 2014 в 20:48
поделиться

5 ответов

31
ответ дан JerKimball 27 August 2018 в 17:50
поделиться

Ваш блок try выходит сразу после запуска новой задачи, потому что этот метод просто продолжает работать.

Вместо этого вы можете поймать исключение как AggregateException , где вы ожидаете завершения задачи (или нескольких задач):

var task1 = Task.Factory.StartNew(() =>
{
    throw new MyCustomException("I'm bad, but not too bad!");
});

try
{
    task1.Wait();
}
catch (AggregateException ae)
{
    // Assume we know what's going on with this particular exception. 
    // Rethrow anything else. AggregateException.Handle provides 
    // another way to express this. See later example. 
    foreach (var e in ae.InnerExceptions)
    {
        if (e is MyCustomException)
        {
            Console.WriteLine(e.Message);
        }
        else
        {
            throw;
        }
    }

}

http://msdn.microsoft.com/en-us/library/dd997415.aspx

7
ответ дан Eric J. 27 August 2018 в 17:50
поделиться

Возможно, вы пытаетесь поймать Corrupted State Exception . Так как приложения .NET 4 не могут поймать такие исключения по умолчанию. Вы можете попытаться добавить запись legacyCorruptedState­­ExceptionsPolicy=true в свой файл конфигурации, как указано в статье MSDN, указанной выше.

0
ответ дан MiGro 27 August 2018 в 17:50
поделиться
2
ответ дан Nick Westgate 27 August 2018 в 17:50
поделиться

Если вы не ожидаете своей задачи, я думаю, что самое легкое решение найдено в Task.Exception :

Получает исключение AggregateException, из-за чего задача заканчивается преждевременно. Если задание выполнено успешно или еще не выбрало никаких исключений, оно вернет null.

Я использую что-то вроде этого:

Task.Factory.StartNew(() => DoStuffHere())
    .ContinueWith(task =>
    {
        if (task.Exception != null)
            Log("log all the exceptions!");
    });
2
ответ дан sǝɯɐſ 27 August 2018 в 17:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: