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