- 说明**:我在计时器触发器上有一个Azure函数,该函数执行多个步骤。每个步骤都有自己的try/catch块,用于接收任何异常并记录这些异常。这些步骤彼此不依赖,因此我不希望异常停止整个函数。
try { await StepOneAsync(); }
catch (Exception ex) { logger.LogError(ex, "Step one failed"); }
try { await StepTwoAsync(); }
catch (Exception ex) { logger.LogError(ex, "Step two failed"); }
- 问题**:如果步骤1失败,我希望Azure将函数视为失败,以便我们仍能接收内置警报并查看调用中的失败。如何在步骤运行后手动将函数标记为失败?
- 尝试的解决方案**:我为每一步添加了标志,如果任何一步失败,我将在最后抛出异常。
var stepOneSucceeded = false;
try
{
await StepOneAsync();
stepOneSucceeded = true;
}
catch (Exception ex) { logger.LogError(ex, "Step one failed"); }
var stepTwoSucceeded = false;
try
{
await StepTwoAsync();
stepTwoSucceeded = true;
}
catch (Exception ex) { logger.LogError(ex, "Step two failed"); }
if (!stepOneSucceeded || !stepTwoSucceeded) throw new Exception("Steps failed");
然而,这是一个虚构的异常,只是为了触发函数失败,似乎是一个变通办法。
2条答案
按热度按时间5q4ezhmt1#
不要使用布尔标志并抛出一个新的异常,而是存储真实的的异常并重新抛出它:
nukf8bse2#
将异常分配给catch块中作用域更高的变量,如下所示:
那你就扔吧。