@microf

Как правильно бросать исключение?

Имеем класс Address с конструктором

public function __construct(string $country,string $city, string $street, string $house, string $building = '') {}


Я хочу валидировать все части адреса (страну, город, улицу, дом, строение). Это всё удается

private function isCountryValid($param) {
        if (empty($param) || !preg_match("/^[а-яё0-9- ]+$/iu", $param)) {
            throw new AddressWithoutCountryException($param);
        }
    }

и тест удается нормально написать

public function testAddressCreatedWithoutCountry() {
        $this->expectException(AddressWithoutCountryException::class);
        CreateCompanyBuilder::instance()->withAddress(new Address('', 'Москва', 'Солнечная', '15',''))->build();
    }

Но что делать, если я хочу сделать тест без параметров вообще

public function testCreateCompanyWithoutAddress() {
        $this->expectException(CompanycWithoutAddressException::class);
        CreateCompanyBuilder::instance()->withAddress(new Address())->build();
    }


В этом случае логично выдается

Failed asserting that exception of type "ArgumentCountError" matches expected exception ... at least 4 expected


Вопрос номер один - как переопределить ArgumentCountError, (и где) чтобы выдавать исключение вроде

class CompanyWithoutAddressException extends ArgumentCountError {
    
    public function __construct()
    {
        parent::__construct('У организации должен быть заполнен адрес');
    }


Сейчас всё равно бросается исключение `ArgumentCountError` даже если сделать так

public function __construct(string $country,string $city, string $street, string $house, string $building = '0') {
        if (!$country && !$city && !$street && !$house) {
            throw new CompanyWithoutAddressException();
        }


И второй вопрос - как лучше сделать передачу параметров в конструктор
string $country,string $city, string $street, string $house, string $building = ''
с необязательным параметром $building (строение). Оно может быть, а может не быть. Можно убрать его из конструктора и передавать сеттером, но хотелось бы прям целиком dto засовывать в конструктор.
  • Вопрос задан
  • 55 просмотров
Пригласить эксперта
Ответы на вопрос 1
@BorisKorobkov
Web developer
Сделайте все параметры необязательными (или передавайте их одним массивом или через сеттеры), проверяйте переданное и бросайте нужные исключения.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
TREEDER Москва
от 170 000 до 300 000 ₽
FunCorp Москва
от 180 000 до 250 000 ₽
Farpost Томск
от 60 000 ₽