Какое исключение PHP SPL следует выбрасывать, если класс не существует

Какое исключение PHP SPL следует выдать, если класс не существует? в контексте стандартов кодирования ZF2 для исключений.

В стандартах сказано, что исключения должны распространяться на одно из исключений PHP SPL. Мое первое предположение будет заключаться в том, что это какое-то исключение RuntimeException.

Исключения PHP SPL


person gawpertron    schedule 10.08.2012    source источник
comment
IMO, это будет InvalidArgumentException, потому что аргумент, переданный автозагрузчику, недействителен (он указывает недопустимое имя класса). Хотя я не уверен в этом, поскольку документы, похоже, указывают, что это следует использовать для аргументов недопустимого типа.   -  person DaveRandom    schedule 10.08.2012
comment
Я согласен; из автозагрузчика это было бы недопустимым аргументом. но что, если вы выдаете исключение после проверки имени класса с помощью class_exists()?   -  person gawpertron    schedule 10.08.2012
comment
@gawpertron снова вы сделаете class_exists("MyClass"), где вы передадите в качестве аргумента, если класс не существует, тогда бросьте InvalidArgument, иначе RuntimeException я думаю, что это хорошо бросить ..   -  person Gntem    schedule 10.08.2012
comment
RuntimeException говорит Exception thrown if an error which can only be found on runtime occurs. - я не согласен с этим из-за ошибки class-not-found. Если класс не существует, это может быть обнаружено до выполнения. Но это зависит от вашего определения обнаружения - руководство немного неясно по этому поводу. Я лично считаю, что имеет больше смысла бросать InvalidArgumentException, потому что независимо от того, пытаетесь ли вы выполнить автозагрузку или просто выполняете class_exists(), переданная вами строка представляет недопустимое имя класса и, следовательно, является недопустимым аргументом.   -  person DaveRandom    schedule 10.08.2012
comment
ознакомьтесь с этим сообщением в блоге: codeutopia.net/blog/2011/05/06/ Это может дать вам некоторые подсказки.   -  person Xerkus    schedule 11.08.2012
comment
Я тоже сталкивался с этим. Это, безусловно, помогает, когда использовать типы исключений.   -  person gawpertron    schedule 14.08.2012
comment
@DaveRandom каково ваше определение среды выполнения? у вас есть пример проверки существования класса до выполнения?   -  person gawpertron    schedule 14.08.2012
comment
Ну, я бы интерпретировал это довольно буквально - время, в которое (или во время которого) выполняется программа. В PHP это имеет тенденцию быть чрезвычайно недолговечным из-за самой природы того, что он делает. Если ваше приложение статично и разработано только вами, вы (или ваша среда IDE) можете определить, существует ли класс, посмотрев, существует ли он. Чем больше я думаю об этом, если вы беспокоитесь о том, чтобы проверить, существует ли класс, вы, по-видимому, разрешаете гораздо более динамичное поведение, и RuntimeException на самом деле может быть более подходящим. Но если вы переусердствуете, то все будет ошибкой времени выполнения.   -  person DaveRandom    schedule 14.08.2012


Ответы (2)


Зависит от контекста вашего приложения.

Если вы получаете имя класса в качестве аргумента метода и пытаетесь загрузить этот класс в том же методе, вам следует использовать исключение InvalidArgumentException.

Если вы получаете имя класса из значения поля или из метода, вам следует использовать RuntimeException

person Maks3w    schedule 09.09.2012

Если бы автозагрузки не существовало, PHP выдал бы RunTimeException, верно? Таким образом, ваш загрузчик должен сделать то же самое, если он не находит класс. (Это ЕСЛИ вы пишете свой собственный автозагрузчик). В соответствии со стандартом кодирования ZF2 он должен генерировать исключение RunTimeException, которое находится ВНУТРИ пространства имен исключений загрузчика.

Таким образом, если ваш загрузчик находится в My\Loader, ваше исключение во время выполнения будет в My\Loader\Exception\RunTimeException.

person Jerry Saravia    schedule 13.08.2012
comment
PSR-4 говорит об обратном этому ответу. Реализации автозагрузчика НЕ ​​ДОЛЖНЫ генерировать исключения, НЕ ДОЛЖНЫ вызывать ошибки любого уровня и НЕ ДОЛЖНЫ возвращать значение. Это не означает, что приложение не может генерировать исключение, но автозагрузчик приложения никогда не должен этого делать. - person Seth Battin; 11.12.2015
comment
Я фанат PSR, так что сказал Сет. - person Jerry Saravia; 30.12.2015