如何确保操作不会导致整个应用程序崩溃?

4

我有一个应用程序,会执行一些额外的任务,比如清理旧日志、发送通知等。如果其中一个任务失败了,我不希望整个应用程序停止工作并且不再执行剩下的任务。

例如:

await SendUsersBirthdayEmailsAsync(); // <-- if something fails while trying to send birthday emails here, I don't want the app to stop working and not clean logs and so on...
await DeleteOutdatedLogsAsync();
await SendSystemNotificationsAsync();

你会推荐我选哪个?


9
为什么不使用try-catch... - 42LeapsOfFaith
这是什么类型的应用程序(控制台/ wpf / winforms / ...)?“崩溃整个应用程序”是什么意思?如果生日邮件逻辑出现故障,您想要做什么? - Fortega
1
@42LeapsOfFaith 你的意思是只捕获一般的异常,比如 try { ... } catch { ... } 吗? - kseen
@Fortega 这是一个控制台应用程序,由Windows任务计划程序每晚运行。如果生日邮件发送失败,我只想记录下来,然后让应用程序继续完成其余的任务。 - kseen
4
问题在于,如果你不知道可能会出现哪些故障,你就没有办法知道程序是否仍然适合执行任何进一步的操作。不要试图“不管发生什么”都继续前进。捕获/处理您可以合理预期和处理的错误,否则最明智的做法是允许程序崩溃并停止运行。除非您正在编写安全关键系统,在这种情况下您将不会使用C#。 - Damien_The_Unbeliever
显示剩余2条评论
11个回答

0
我建议先找出你从async得到的异常,然后你可以在主Thread上使用它来理解。
MyTask().GetAwaiter().GetResult();

这将允许您查看在您的 await 线程上实际异常的文本内容。


如果你不想让主线程在带有await的行返回,你也可以使用以下方法:

await SendUsersBirthdayEmailsAsync().ConfigureAwait(false);

这将在最近的空闲线程上继续您的任务。

但需要说明的是,这会在Android上引发异常,因为它有一些使用线程的限制。


如果您不想浪费时间或者不需要手动处理异常并修复它,trycatchfinally始终是一个选项。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接