2016-01-30 5 views
0

В нетипизированном языке, во время выполнения утверждение может поймать «ошибку типа»:Do Hack программисты используют утверждения runtime?

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

С примечаниями типа Hack, я хотел бы удалить утверждения, но это небезопасно, потому что нетипизированный код может до сих пор называют типизированных функцию.

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

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

К любым профессиональным разработчикам Hack: применяете ли вы подписи типов с утверждениями? (Мне бы очень хотелось знать, что такое политика Facebook, но я понимаю, если это секрет.)

ответ

2

Невозможно встретить подпись типа во время выполнения, бросает E_RECOVERABLE_ERROR. Как вы справляетесь с этим, это зависит от вашего обработчика ошибок.

Рекомендуется использовать assert, так как это версия с конфигурацией eval. Вместо этого Hack вводит функцию invariant, которую вы можете использовать для предоставления информации проверяющему тип, который, как вы знаете, является истинным, но он не может понять. Звонки на invariant всегда проверяются во время выполнения и выдают исключение, если они терпят неудачу.

Итак, в вашем примере у меня не было бы никаких дополнительных проверок, поскольку вызов add_one("yes"); уже приведет к ошибке во время выполнения.

+0

Да, с обработчиком ошибок, который преобразует ошибки аннотации типа во что-то более полезное, чем «E_RECOVERABLE_ERROR» и пустая белая страница. Facebook выдает исключение, которое мы обнаруживаем на основных границах ошибок, например, поэтому ошибка в одной новостной ленте просто приводит к сбою одной истории, а не всей странице. –

 Смежные вопросы

  • Нет связанных вопросов^_^