如何手动使Azure功能失败?

laawzig2  于 2023-02-25  发布在  其他
关注(0)|答案(2)|浏览(139)
    • 说明**:我在计时器触发器上有一个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");

然而,这是一个虚构的异常,只是为了触发函数失败,似乎是一个变通办法。

5q4ezhmt

5q4ezhmt1#

不要使用布尔标志并抛出一个新的异常,而是存储真实的的异常并重新抛出它:

var exceptionsOccured = new List<Exceptions>();

try
{
    await StepOneAsync();
}
catch (Exception ex)
{
    exceptionsOccured.Add(ex);
}

try
{
    await StepTwoAsync();
}
catch (Exception ex)
{
    exceptionsOccured.Add(ex);
}

if (exceptionsOccured.Count > 0)
{
    throw new AggregateException(exceptionsOccured);
}
nukf8bse

nukf8bse2#

将异常分配给catch块中作用域更高的变量,如下所示:

Exception savedEx;

...

catch(Exception ex) {
  savedEx = ex;
}

那你就扔吧。

相关问题