我尝试用Q#编写算法。在某些情况下,该算法无法计算出成功的结果,因为用户传递了一些错误的参数。在这种情况下,我想引发异常,现在我想知道:是否可以在Q#中引发和捕获异常?
如果是,我该怎么做?Q#中异常处理的正确方法是什么?
如果没有:为什么?有什么解决方法吗?
最佳答案
catch
子句在通用语言中特别有用的许多情况看起来有点像处理I / O错误,因为它们很难通过普通的流控制来预测和处理。相比之下,Q#程序的执行意图是可预测的,因此像Adjoint
和Controlled
这样的函子可以生成程序的适当转换,作为较大量子算法的一部分。
就是说,正如您所指出的那样,有时无法明智地从某种状况出发。因此,Q#提供了一个fail
语句,该语句的操作与throw
语句相似(但采用的是String
而不是异常对象),但没有提供与try
– catch
块类似的语句。 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}'";
}
}