Assertions 黑客程序员使用运行时断言吗?

Assertions 黑客程序员使用运行时断言吗?,assertions,hacklang,Assertions,Hacklang,在非类型化语言中,运行时断言可以捕获“类型错误”: 对于Hack的类型注释,我希望删除断言,但这是不安全的,因为非类型化代码仍然可能调用类型化函数 <?hh // strict function add_one(int $x): int { return $x+1; } function evil(): void { // UNSAFE add_one("yes"); // Runtime error! } ?> 对于任何专业黑客开发人员:您是否使用断言强制执

在非类型化语言中,运行时断言可以捕获“类型错误”:


对于Hack的类型注释,我希望删除断言,但这是不安全的,因为非类型化代码仍然可能调用类型化函数

<?hh // strict
function add_one(int $x): int {
  return $x+1;
}

function evil(): void {
  // UNSAFE
  add_one("yes"); // Runtime error!
}
?>

对于任何专业黑客开发人员:您是否使用断言强制执行类型签名?
(我很想知道Facebook的政策是什么,但我知道这是否是一个秘密。)

在运行时未能满足类型签名会抛出一个
E\u可恢复\u错误。如何处理此问题取决于错误处理程序

建议不要使用
assert
,因为它是
eval
的配置控制版本。相反,Hack引入了这个函数,您可以使用它向类型检查器提供信息,您知道这些信息是正确的,但它无法识别。对
invariant
的调用总是在运行时进行检查,如果失败,将抛出异常


因此,在您的示例中,我不需要任何额外的检查,因为
add_one(“yes”)调用将在运行时导致错误。

是的,有一个错误处理程序将类型注释失败转换为比
E\u可恢复的\u错误更有用的东西,并且有一个空白的白页是有用的。Facebook抛出了一个异常,我们在主要错误边界处捕捉到了这个异常,例如,单个新闻提要故事中的错误只会导致一个故事失败,而不是整个页面失败。
<?hh // strict
function add_one(int $x): int {
  return $x+1;
}

function evil(): void {
  // UNSAFE
  add_one("yes"); // Runtime error!
}
?>