Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
fmap :: Functor f => (a -> b) -> f a -> f b
let input = readFile "input.file"
let result = fmap clearLogic input
output result
>>= :: Monad m => (a -> m b) -> m a -> m b
if ($_GET['param'] > 0) {
$model->setParam($_GET['param']);
render('Success');
}
else {
render('Error', 'Param is not positive');
}
, а, например, if ($model->setParam($_GET['param'])) {
render('Success');
}
else {
render('Error', $model->getErrorMessage());
}
In [2]: float(0)/float(0)
---------------------------------------------------------------------------
ZeroDivisionError Traceback (most recent call last)
/home/muromec/ in ()
ZeroDivisionError: float division
The trend over the last 25 years or so has been to design computer languages that enforce a state of paranoia. You're expected to program every module as if it were in a state of siege.
Ограничивайте, отклоняйте и очищайте пользовательский ввод. Иначе говоря, предполагайте, что весь пользовательский ввод является злонамеренным. Проводите проверку длины, диапазона, формата и типа вводимых данных.
Всегда проверяйте ввод на наличие неверных или злонамеренных данных на стороне сервера,
поскольку проверка на стороне клиента может быть без труда подделана.
Невалидность входных данных должна рассматриваться как штатный режим работы. Он не должен валить программу. В зависимости от принятой в проекте идеологии, при приходе невалидных данных можно написать сообщение в лог, выдать сообщение пользователю или вообще молча исправить данные на валидные и продолжить работу.
вопрос звучал так: как без анализа содержимого делителя обработать ошибку деления на ноль:
предполагается ответ с try...catch
If during the evaluation of an expression, the result is not mathematically defined or not in the range of
representable values for its type, the behavior is undefined. [ Note: most existing implementations of C++
ignore integer overflows. Treatment of division by zero, forming a remainder using a zero divisor, and all
floating point exceptions vary among machines, and is usually adjustable by a library function. —end note ]
private double DivUnsafe(double a, double b)
{
Debug.Assert(!/*корректное сравнение b с 0.0*/);
return a / b;
}
public double Div(double a, double b)
{
// Не допускается выбрасывание из библиотеки ZeroDivisionException,
// NullReferenceException и тому подобных исключений.
if (/*корректное сравнение b с 0.0*/)
{
throw new ArgumentException(...);
}
return DivUnsafe(a, b);
}
try
{
c = Div(a, b);
}
cactch (ArgumentException ex)
{
// Обработка ошибки, например:
throw new MyBusinessLogicException(..., a, b, ex);
}
if (/*корректное сравнение b с 0.0*/)
{
// Обработка ошибки, например:
throw new MyBusinessLogicException(..., a, b);
}
с = Div(a, b);
class ArgumentException extends Exception {
public function __construct($message, $code, $previous) {
parent::__construct($message, $code, $previous);
}
public function __toString() {
parent::__toString();
}
}
interface Ifoo {
/**
*
* @param mixed $a
* @param mixed $b
* @return double
*/
public function Test($a, $b);
}
class fooProtected implements Ifoo {
/**
*
* @param mixed $a
* @param mixed $b
* @return double
*/
public function Test($a, $b){
return $this->_Test();
}
/**
*
* @access protected
* @param double $a
* @param double $b
* @throws divide
* @return double
*/
protected function _Test($a, $b) {
return $a / $b;
}
}
class barUnProtected extends fooProtected {
/**
*
* @access protected
* @param mixed $a
* @param mixed $b
* @return double
*/
protected function _Test($a, $b) {
//valid
if(!is_double($a) || !is_double($b))
throw new ArgumentException('Some variables not convertible to double!');
//user rule
if($b == 0)
return 0.0;
return parent::_Test($a, $b);
}
}
/**
*
* @param Ifoo $dividor
* @param mixed $a
* @param mixed $b
* @throws ArgumentException on un protected
* @throws Exception
* @return double
*/
function dividePleaseTwoStrangeParams($dividor, $a, $b) {
try
{
if($dividor instanceof Ifoo)
{
return $dividor->Test($a, $b);
}
}
catch (ArgumentException $exc)
{
echo $exc->getTraceAsString();
return 0.0;
}
catch(Exception $exc)
{
echo $exc->getTraceAsString();
return 0.0;
}
}
* This source code was highlighted with Source Code Highlighter.
Они и естьтемто, ради чего вся эта затея начиналась.
Концепция баррикады