Несколько возвращаемых значений для указания на успех/отказ.

<script type="text/javascript">

        function file_upload() {
            var imgpath = document.getElementById("<%=FileUpload1.ClientID %>").value;
            if (imgpath == "") {
                alert("Upload your Photo...");
                document.file.word.focus();
                return false;
            }
            else {
                // code to get File Extension..

                var arr1 = new Array;
                arr1 = imgpath.split("\\");
                var len = arr1.length;
                var img1 = arr1[len - 1];
                var filext = img1.substring(img1.lastIndexOf(".") + 1);
                // Checking Extension
                if (filext == "bmp" || filext == "gif" || filext == "png" || filext == "jpg" || filext == "jpeg" ) {
                    alert("Successfully Uploaded...")
                    return false;
                }
                else {
                    alert("Upload Photo with Extension ' bmp , gif, png , jpg , jpeg '");
                    document.form.word.focus();
                    return false;
                }
            }
        }

        function Doc_upload() {
            var imgpath = document.getElementById("<%=FileUpload2.ClientID %>").value;
            if (imgpath == "") {
                alert("Upload Agreement...");
                document.file.word.focus();
                return false;
            }
            else {
                // code to get File Extension..

                var arr1 = new Array;
                arr1 = imgpath.split("\\");
                var len = arr1.length;
                var img1 = arr1[len - 1];
                var filext = img1.substring(img1.lastIndexOf(".") + 1);
                // Checking Extension
                if (filext == "txt" || filext == "pdf" || filext == "doc") {
                    alert("Successfully Uploaded...")
                    return false;
                }
                else {
                    alert("Upload File with Extension ' txt , pdf , doc '");
                    document.form.word.focus();
                    return false;
                }
            }
        }
</script>
5
задан Anant Singh---Alive to Die 5 June 2015 в 17:53
поделиться

14 ответов

Я соглашаюсь с другими, кто заявил, что это находится немного на стороне WTFy. Если это ясно зарегистрировало функциональность, то это - меньше проблемы, но я думаю, что было бы более безопасно следовать альтернативным маршрутом возврата 0 для успеха и целых чисел для кодов ошибок. Если Вам не нравятся та идея или идея глобальной последней ошибочной переменной, рассмотрите переопределение Вашей функции как:

function createUser($username, &$error)

Затем можно использовать:

if (createUser('fred', $error)) {
    echo 'success';
}
else {
    echo $error;
}

Внутри createUser, просто заполните $error с любой ошибкой, с которой Вы встречаетесь, и это будет доступно за пределами функционального объема из-за ссылки.

13
ответ дан 18 December 2019 в 07:58
поделиться

Пока это зарегистрировано и законтрактовано, и не также WTFy, затем не должно быть проблемы.

С другой стороны я рекомендовал бы использовать исключения для чего-то вроде этого. Это имеет больше смысла. Если бы можно использовать PHP5, то это было бы способом пойти. Иначе у Вас нет большого выбора.

2
ответ дан 18 December 2019 в 07:58
поделиться

Более общий подход, который я видел, когда исключения не доступны, должен сохранить ошибочный тип в 'last_error' переменной где-нибудь и затем когда отказ происходит (т.е. это возвращает false), ищут ошибку.

Другой подход должен использовать пронумерованные коды ошибок подхода инструмента почтенного Unix - возвращаются 0 для успеха и любого целого числа (который отображается на некоторую ошибку) для различных состояний ошибки.

Большинство из них страдает по сравнению с исключениями, когда я видел их используемый как бы то ни было.

Только для ответа на комментарий Andrew - я соглашаюсь, что last_error не должен быть глобальным, и возможно 'где-нибудь' в моем ответе было немного неопределенно - другие люди уже предложили лучшие места, таким образом, я не потружусь повторять их

2
ответ дан 18 December 2019 в 07:58
поделиться

насколько приемлемый практика как это?

Я сказал бы, что это недопустимо.

  1. Требует === оператора, который очень опасен. Если пользователь использовал ==, это приводит к очень твердому для нахождения ошибки.
  2. Используя "0" и, "" для обозначения лжи может измениться в будущих версиях PHP. Плюс на большом количестве других языков "0" и "" не оценивает ко лжи, которая приводит к большому беспорядку

Используя getLastError () тип глобальной функции является, вероятно, лучшей практикой в PHP, потому что это соединяется хорошо с языком, так как PHP является все еще главным образом процедурным языком. Я думаю другая проблема с подходом, который Вы просто дали, то, что очень немного других систем работают как этот. Программист должен изучить этот способ проверки ошибок, которая является источником ошибок. Лучше заставлять вещи работать как то, как большинство людей ожидает.

if ( makeClient() )
{ // happy scenario goes here }

else
{
    // error handling all goes inside this block
    switch ( getMakeClientError() )
    { case: // .. }
}
2
ответ дан 18 December 2019 в 07:58
поделиться

Часто Вы будете возвращаться 0, чтобы указать на успех, и 1, 2, 3, и т.д. указать на различные отказы. Вашим способом сделать его является вид hackish, потому что у Вас может только быть столько ошибок, и этот вид кодирования укусит Вас рано или поздно.

Мне нравится определять структуру/объект, которая включает булевскую переменную для указания на успех, и сообщение об ошибке или другое значение указывают, какая ошибка произошла. Можно также включать другие поля для указания, какое действие выполнялось.

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

2
ответ дан 18 December 2019 в 07:58
поделиться

Когда исключения не доступны, я использовал бы модель PEAR и обеспечил бы isError () функциональность во всех Ваших классах.

1
ответ дан 18 December 2019 в 07:58
поделиться

Ick.

В предварительном исключении Unix это сделано с errno. Вы возвращаетесь 0 для успеха или-1 для отказа, затем у Вас есть значение, которое можно получить с целочисленным кодом ошибки для получения фактической ошибки. Это работает во всех случаях, потому что у Вас нет (реалистического) предела количеству кодов ошибок. INT_MAX - конечно, больше чем 7, и Вы не должны волноваться о типе (errno).

Я голосую против решения предложенный в вопросе.

0
ответ дан 18 December 2019 в 07:58
поделиться

Изобретение велосипед здесь. Используя квадраты.

Хорошо, у Вас нет исключений в PHP 4. Добро пожаловать в 1982 году, смотрите на C.

У Вас могут быть коды ошибок. Рассмотрите отрицательные величины, они кажутся более интуитивными, таким образом, необходимо было бы просто проверить если (createUser ()> 0).

У Вас может быть журнал ошибок, если Вы хотите с сообщениями об ошибках (или просто произвольные коды ошибок) продвинутый на массив, имел дело с элегантностью впоследствии.

Но PHP является свободно типизированным языком по причине, и коды ошибок броска, которые имеют различные типы, но оценивают к той же "лжи", являются чем-то, что не должно быть сделано.

Что происходит, когда у Вас заканчиваются встроенные типы?

Что происходит, когда Вы получаете новый кодер и должны объяснить, как эта вещь работает? Скажите за 6 месяцев, Вы не будете помнить.

Является PHP === оператором достаточно быстро для прохода через него? Это быстрее, чем коды ошибок? или какой-либо другой метод?

Просто отбросьте его.

1
ответ дан 18 December 2019 в 07:58
поделиться

Если Вы действительно хотите сделать такого рода вещь, у Вас должны быть различные значения для каждой ошибки и проверка на успех. Что-то как

define ('OK', 0);
define ('DUPLICATE_USERNAME', 1);
define ('DATABASE_ERROR', 2);
define ('INSUFFICIENT_DETAILS', 3);

И проверка:

if (createUser('fred') == OK) {
    //OK

}
else {
    //Fail
}
0
ответ дан 18 December 2019 в 07:58
поделиться

Мне нравится способ, которым COM может обработать и исключение и неисключение способные вызывающие стороны. Пример ниже шоу, как HRESULT тестируется и исключение, брошен в случае отказа. (обычно автоматически генерируемый в tli файлах)

inline _bstr_t IMyClass::GetName ( ) {
    BSTR _result;
    HRESULT _hr = get_name(&_result);
    if (FAILED(_hr)) _com_issue_errorex(_hr, this, __uuidof(this));
    return _bstr_t(_result, false);
}

Используя возвращаемые значения будет влиять на удобочитаемость путем рассеивания обработки ошибок и худшего случая, возвращаемые значения никогда не проверяются кодом. Вот почему я предпочитаю исключение, когда контракт нарушен.

0
ответ дан 18 December 2019 в 07:58
поделиться

Другие пути включают исключения:

throw new Validation_Exception_SQLDuplicate("There's someone else, hun");),

возврат структур,

return new Result($status, $stuff);
if ($result->status == 0) {
    $stuff = $result->data;
}
else {
    die('Oh hell');
}

Я не хотел бы быть человеком, который приехал после Вас для использования шаблона кода Вы предложили первоначально.

И я имею в виду, "Стал после Вас" в "сопровождаемом Вы в занятости и должен был поддержать код", а не "прибыл после Вас" "с wedgiematic", хотя оба - опции.

0
ответ дан 18 December 2019 в 07:58
поделиться

По-моему, необходимо использовать эту технику, только если отказ является "нормальной частью операции" метода / функция. Например, столь же вероятно, что вызов успешно выполняется как который это приводит к сбою. Если отказ является исключительным событием, то необходимо использовать обработку исключений, таким образом, программа может завершиться максимально рано и корректно.

Что касается Вашего использования различных "ложных" значений, я должен возвратить экземпляр пользовательского "Результата" - класс с надлежащим кодом ошибки. Что-то как:

class Result
{
    var $_result;
    var $_errormsg;

    function Result($res, $error)
    {
       $this->_result = $res;
       $ths->_errorMsg = $error
    }

    function getResult()
    {
       return $this->_result;
    }

    function isError()
    {
       return ! ((boolean) $this->_result);
    }

    function getErrorMessage()
    {
       return $this->_errorMsg;
    }
-1
ответ дан 18 December 2019 в 07:58
поделиться

Взгляд на COM HRESULT для корректного способа сделать это.

Но исключения обычно лучше.

Обновление: корректный путь: определите столько ошибочных значений, сколько Вы хотите, не только "ложные". Используйте функцию, за которой следуют (), чтобы проверить если функция, за которой следуют.

if (succeeded(result = MyFunction()))
  ...
else
  ...
-2
ответ дан 18 December 2019 в 07:58
поделиться

Это действительно имеет смысл, что успешное выполнение возвращает true. Обработка универсальных ошибок будет намного легче:

if (!createUser($username)) {
// the dingo ate my user.
// deal with it.
}

Но не имеет смысла вообще связывать значение с различными типами лжи. Ложь должна означать одну вещь и одну вещь только, независимо от типа или как язык программирования рассматривает его. Если Вы собираетесь определить ошибочные константы состояния так или иначе, лучше придерживаться переключателя/случая

define(DUPLICATE_USERNAME, 4)
define(USERNAME_NOT_ALPHANUM, 8)

switch ($status) {
case DUPLICATE_USERNAME:
  // sorry hun, there's someone else
  break;
case USERNAME_NOT_ALPHANUM:
  break;
default:
  // yay, it worked
}

Также с этой техникой, Вы сможете к поразрядному И и ИЛИ сообщения о состоянии, таким образом, можно возвратить сообщения состояния, которые несут больше чем одно значение как DUPLICATE_USERNAME & USERNAME_NOT_ALPHANUM и рассматривайте его соответственно. Это - не всегда хорошая идея, она зависит от того, как Вы используете ее.

0
ответ дан 18 December 2019 в 07:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: