2016-01-30 20 views
0

在一个非类型化的语言,运行时断言可以赶上“类型错误”:做Hack程序员使用运行时断言?

<?php 
function add_one($x) { 
    assert(is_int($x)); 
    return $x+1; 
} 
?> 

随着哈克的类型注解,我想删除的说法,但这是不安全的,因为无类型的代码仍然可以调用类型的功能。

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

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

哪个专业哈克开发商:你强制类型签名与断言? (我真的很想知道Facebook的政策是什么,但我明白这是不是一个秘密。)

回答

2

未能在运行时遇到类型签名会抛出E_RECOVERABLE_ERROR。你如何处理这个问题取决于你的错误处理程序。

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

因此,在您的示例中,我将不会执行任何其他检查,因为add_one("yes");调用在运行时已经导致错误。

+0

是的,有一个错误处理程序将类型注释失败转换为比'E_RECOVERABLE_ERROR'和空白页面更有用的东西是有用的。 Facebook的抛出了一个例外,我们在主要的错误边界处捕捉到了异常,例如,单个新闻馈送故事中的错误只会导致一个故事失败,而不是整个页面。 –

相关问题