【发布时间】:2018-07-24 13:43:48
【问题描述】:
我尝试在 Q# 中编写算法。在某些情况下,算法无法成功计算结果,因为用户传递了一些错误的参数。在这种情况下,我想抛出一个异常,现在我想知道:是否可以在 Q# 中抛出和捕获异常?
如果是:我该怎么做? Q# 中异常处理的正确方法是什么?
如果不是:为什么?有什么解决办法吗?
【问题讨论】:
我尝试在 Q# 中编写算法。在某些情况下,算法无法成功计算结果,因为用户传递了一些错误的参数。在这种情况下,我想抛出一个异常,现在我想知道:是否可以在 Q# 中抛出和捕获异常?
如果是:我该怎么做? Q# 中异常处理的正确方法是什么?
如果不是:为什么?有什么解决办法吗?
【问题讨论】:
catch 子句在通用语言中特别有用的许多情况看起来有点像处理 I/O 错误,因为它们很难通过普通的流控制来预测和处理。相比之下,Q# 程序的执行是可预测的,因此像 Adjoint 和 Controlled 这样的仿函数可以生成适当的程序转换,作为更大的量子算法的一部分。
也就是说,正如您所指出的,有时人们无法明智地从某种情况出发。因此,Q# 提供了fail 语句,其操作类似于throw 语句(但采用String 而不是异常对象),但不提供try–catch 块的类似物。 fail 语句旨在向 C# 主机程序传达 Q# 程序无法正常执行的情况,并且对于用户传递错误实例等情况很有用。例如,在标准库中的整个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}'";
}
}
【讨论】: