Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Условие вызова исключения, Когда нужно его вызывать?  
:(
    Опции темы
SqueeZe
Дата 12.1.2008, 00:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 1.10.2007
Где: Санкт-Петербург

Репутация: 1
Всего: 1



Собственно, что какой критерий должен указывать на то, что является критической ошибкой и должно вызывать исключение.

Для примера приведу код недавно написанного класса Collection. Я установил вызовы исключений в местах, где мне кажется разумным. Но. Например тот же метод clear(). Ведь правильно, что не должно возникать исключение, если массив пуст?

Код

<?php

require_once "collectioniterator.class.php";

class Collection implements IteratorAggregate
{
    private $_onLoad;
    private $isLoaded = false;
   
    private $_members = array();   
    private $_keys = array(); 
    
    public function getIterator()
    {
        $this->_checkCallback();
        
        return new CollectionIterator(clone $this);
    }
     
    private function _updateKeys()  
    {
       $this->_keys = array_keys($this->_members);
    }
     
    public function getItem($key)
    {
        $this->_checkCallback();
        
        if (isset($this->_members[$key])) {
            return $this->_members[$key];
        }
        else {
            throw new KeyInvalidException('Некорректный ключ [' . $key . ']');
        }
    }    
    
    public function getItemAt($index) 
    {
        $this->_checkCallback();
    
        if (isset($this->_keys[$index])) {            
            return $this->_members[$this->_keys[$index]];
        }
        else {
            throw new IndexOutOfRangeException('Не существует элемента с индексом [' . $index . ']');
        }        
    }    
    
    public function addItem($obj, $key = null)
    {
        $this->_checkCallback();
        
        if($key) {
            if (isset($this->_members[$key])) {
                throw new KeyInUseException('Ключ [' . $key . '] уже используется.');
            }
            else {
                $this->_members[$key] = $obj;
                $this->_updateKeys();
            }
        }
        else {
            $this->_members[] = $obj;
            $this->_updateKeys();
        }
    }   

    public function clear()
    {
        if (!empty($this->_members)) {
            unset($this->_members);
            $this->_members = array();    
            $this->_updateKeys();        
        }            
    }
    
    public function isEmpty() 
    {           
       return empty($this->_members);       
    }
    
    public function removeItem($key)
    {
        if (isset($this->_members[$key])) {
            unset($this->_members[$key]);
            $this->_updateKeys();    
        }
        else {
            throw new KeyInvalidException('Некорректный ключ [' . $key . ']');
        }
    }
    
    public function removeItemAt($index)
    {
        if (isset($this->_keys[$index])) {            
            unset($this->_members[$this->_keys[$index]]);
            $this->_updateKeys();
        }
        else {
            throw new IndexOutOfRangeException('Не существует элемента с индексом [' . $index . ']');
        }        
    }
    
    public function reverse() 
    {
        if (!empty($this->_members)) {
            $this->_members = array_reverse($this->_members, true);
        }
    }    
    
    public function length() 
    {
        $this->_checkCallback();
        
        return sizeof($this->_members);
    }
        
    public function keys()
    {
        $this->_checkCallback();
        
        return $this->_keys;
    } 
    
    public function setLoadCallback($functionName, $objOrClass = null)
    {
        if ($objOrClass) {
            $callback = array($objOrClass, $functionName);
        }
        else {
            $callback = $functionName;
        }
        
        if (!is_callable($callback, false, $callableName)) {
            throw new LoadCallbackException($callableName . ' не является корректным параметром onload');            
        }
        $this->_onload = $callback;
    }
    
    private function _checkCallback()  
    {
        if (isset($this->_onload) && !$this->_isLoaded) {
            call_user_func($this->_onload, $this);
            $this->_isLoaded = true;
        }
    }
    
    public function ___show() {
            print_r($this->_members);
        }
}

class KeyInUseException extends Exception { }
class KeyInvalidException extends Exception { }
class IndexOutOfRangeException extends Exception { }
class LoadCallbackException extends Exception { }

?> 

PM MAIL ICQ   Вверх
onsql
Дата 12.1.2008, 01:27 (ссылка) |   (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 3.12.2007

Репутация: нет
Всего: 3



Ну мне кажется разумным такое правило: исключение должно возбуждаться когда твой код сталкивается с непредусмотренной алгоритмом ситуацией либо не способен самостоятельно её разрешить. Несколько расплывчато, я понимаю...
Ну вот например метод clear. Если список элементов уже пуст, то нет никакого смысла бросать исключения. Назначение метода - очистить коллекцию. Постусловие - список элементов пуст. В случае пустого списка, метод прекрасно справляется с задачей, ничего не делая.
Другой коленкор - getItemAt. Что должен возвращать твой код, если нет элемента с заданным индексом? Аварийно останавливать программу? Писать об ошибках в лог? Возвращать специальное значение, сигнализирующее об ошибке? В любом случае, налицо ситуация, обработка которой лежит вне ответственности класса-коллекции. Исключение в данном случае - стандартный механизм сигнализации о нештатном завершении операции в ООП.
ИМХО конечно smile
PM MAIL   Вверх
FractalizeR
Дата 12.1.2008, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 273
Регистрация: 27.12.2007
Где: Россия/Москва

Репутация: 2
Всего: 4



Цитата
Собственно, что какой критерий должен указывать на то, что является критической ошибкой и должно вызывать исключение.

Согласен с onsql. Критерием можно считать следующее: возникла ситуация, при которой исполнямый в данный момент код не знает, что ему делать. Очистка уже пустой коллекции, конечно, под этот критерий не подходит.

Это сообщение отредактировал(а) FractalizeR - 12.1.2008, 17:39


--------------------
Чтобы поблагодарить или наоборот поругать участника форума лучше пользоваться значками "+" и "-", изменяющими репутацию. Они находятся слева от поста под именем пользователя.
PM MAIL   Вверх
SqueeZe
Дата 12.1.2008, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 1.10.2007
Где: Санкт-Петербург

Репутация: 1
Всего: 1



Спасибо за ответы.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0896 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.