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

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

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

最佳答案

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

就是说,正如您所指出的那样,有时无法明智地从某种状况出发。因此,Q#提供了一个fail语句,该语句的操作与throw语句相似(但采用的是String而不是异常对象),但没有提供与trycatch块类似的语句。 fail语句旨在与Q#程序无法明智地进行处理的C#主机程序进行通信,并且对于诸如用户传递错误实例的情况很有用。例如,在标准库中的整个Facts.qs文件中使用此函数来实现经典的断言功能,例如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}'";
    }
}

09-18 01:41