我如何在 Q# 中抛出异常?

How can i throw an exception in Q#?

我尝试用 Q# 编写算法。在某些情况下,算法无法计算出成功的结果,因为用户传递了一些错误的参数。在这种情况下,我想抛出一个异常,现在我想知道:是否可以在 Q# 中抛出和捕获异常?

如果是:我该怎么做以及 Q# 中异常处理的正确方法是什么?

如果不是:为什么?有什么解决方法吗?

许多 catch 子句在通用语言中特别有用的情况看起来有点像处理 I/O 错误,因为它们很难通过普通流程预测和处理控制。相比之下,Q# 程序旨在在其执行过程中进行预测,以便像 AdjointControlled 这样的仿函数可以生成适当的程序转换,作为更大的量子算法的一部分。

就是说,正如您所指出的,有些时候人们无法明智地从某种情况出发。因此,Q# 提供了一个 fail 语句,其操作类似于 throw 语句(但采用 String 而不是异常对象),但不提供类似于 trycatch块。 fail 语句旨在向 C# 主机程序传达 Q# 程序无法明智地继续执行的信息,并且在用户传递错误实例等情况下很有用。例如,这用于整个 Facts.qs file in the standard libraries to implement classical assertion functions such as EqualityWithinToleranceFact:

function EqualityWithinToleranceFact(actual : Double, expected : Double, tolerance : Double) : Unit {
    let delta = actual - expected;
    if (delta > tolerance or delta < -tolerance) {
        fail $"Fact was false. Expected: '{expected}'. Actual: '{actual}'";
    }
}