Почему и как Вы использовали бы Исключения в этом демонстрационном коде PHP?

Я попробовал библиотеку Text_LanguageDetect, и полученные результаты были не очень хорошими (например, текст «тест» был идентифицирован как эстонский, а не английский).

Я могу порекомендовать вам попробовать Яндекс Перевод API , который является БЕСПЛАТНЫМ для 1 миллиона символов на 24 часа и до 10 миллионов символов в месяц. Он поддерживает (согласно документации) более 60 языков.

code == 200)
        {
            if (strlen($outputJson->lang) > 0)
            {
                return $outputJson->lang;
            }
        }
    }

    return "unknown";
}

function translateText($text, $targetLang)
{
    $baseUrl = "https://translate.yandex.net/api/v1.5/tr.json/translate?key=YOUR_API_KEY";
    $url = $baseUrl . "&text=" . urlencode($text) . "&lang=" . urlencode($targetLang);

    $ch = curl_init($url);

    curl_setopt($ch, CURLOPT_CAINFO, YOUR_CERT_PEM_FILE_LOCATION);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, TRUE);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);

    $output = curl_exec($ch);
    if ($output)
    {
        $outputJson = json_decode($output);
        if ($outputJson->code == 200)
        {
            if (count($outputJson->text) > 0 && strlen($outputJson->text[0]) > 0)
            {
                return $outputJson->text[0];
            }
        }
    }

    return $text;
}

header("content-type: text/html; charset=UTF-8");

echo identifyLanguage("エクスペリエンス");
echo "
"; echo translateText("エクスペリエンス", "en"); echo "
"; echo translateText("エクスペリエンス", "es"); echo "
"; echo translateText("エクスペリエンス", "zh"); echo "
"; echo translateText("エクスペリエンス", "he"); echo "
"; echo translateText("エクスペリエンス", "ja"); echo "
"; ?>

23
задан Welbog 1 June 2009 в 16:09
поделиться

4 ответа

Когда следует использовать исключение?

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

Например, у вас может быть метод Record :: save () , который сохраняет изменения записи в базе данных. Если по какой-то причине это невозможно сделать (например, возникает ошибка базы данных или нарушается ограничение данных), вы можете создать исключение, чтобы указать на сбой.

Как создать собственные исключения?

Исключения обычно называются так, чтобы указывать на природу ошибки, например, DatabaseException . Вы можете создать подкласс Exception для создания исключений с пользовательскими именами таким образом, например

class DatabaseException extends Exception {}

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

Когда не следует Я использую исключение?

Рассмотрим еще один пример; метод, который проверяет наличие файла. Вероятно, это должно , а не вызывать исключение, если файл не существует, поскольку целью метода было выполнение указанной проверки. Однако метод, открывающий файл и выполняющий некоторую обработку , может вызвать исключение, поскольку ожидалось, что файл существует, и т. Д.

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

58
ответ дан 29 November 2019 в 01:01
поделиться

Я не программист PHP, но это похоже на C #.

Обычно вам нужно выдавать ошибки, если это точка невозврата. Тогда вы сможете что-то записать, чтобы показать, что произошло невозможное.

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

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

Я бы сказал, что это хорошая практика проектирования, чтобы избежать перехвата всех исключений «catch (Exception $ e)» и разработки вместо этого по контракту, как вы, кажется, делаете в предыдущем примере. Сначала я хотел бы более конкретно указать тип создаваемого исключения, а затем при необходимости работать оттуда. В противном случае держитесь подальше от try-> catch и исключений.

4
ответ дан 29 November 2019 в 01:01
поделиться

Ни в коем случае нельзя предполагать, что файл существует только потому, что вы вызвали file_exists () ! Функция file_exists не открывает файл, поэтому файл потенциально можно удалить, переименовать или переместить в любое время!

class FileOutputter
{
    public function outputFile($file)
    {
        if (!file_exists($file))
            return false;
        ///<--- file may be deleted right here without you knowing it
        return file_get_contents($file);//<-- then this will throw an error
            //if you don't catch it, you're program may halt.
    }
}

Я считаю, что так лучше:

class FileOutputter
{
    public function outputFile($file)
    {
        try{
            if (!file_exists($file))
                return false;
            return file_get_contents($file);
        }catch(Exception e){
            check_what_went_wrong_and_go_to_plan_B();
        }
    }
}

( Изменить ]: И, вероятно, даже лучше попытаться открыть файл с самого начала. Если вам это удастся, у вас есть «блокировка» файла, и он не исчезнет просто так. Если нет, то перехватите исключение и посмотрите, что произошло. неправильно.

С другой стороны, вы можете подумать, что такой уровень избыточности просто глуп. В этом случае я не думаю, что вам вообще нужно беспокоиться о try / catch :)

4
ответ дан 29 November 2019 в 01:01
поделиться

Просто примечание, ваш код для средства вывода файлов недействителен, поскольку file_get_contents ($ file) не вызывает исключения. Однако это вызовет предупреждение, если файл не существует или недоступен по какой-либо причине. Кроме того, вы возвращаете исключение из outputFile, когда вам, вероятно, следует просто позволить ошибке распространиться вверх по стеку вызовов.

Однако вы можете зарегистрировать обработчик ошибок в php, чтобы генерировать исключения при возникновении ошибки:

function exception_error_handler($errno, $errstr, $errfile, $errline ) {
    throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
}
set_error_handler("exception_error_handler");

That Таким образом, любые стандартные вызовы функций, вызывающие ошибку, вызовут исключение.

Итак, я бы изменил FileOutputter на это (с добавленным выше фрагментом):

class FileOutputter
{
 public function outputFile($file)
 {
  if (!file_exists($file))
   throw new Exception("File not found.",123);

   return file_get_contents($file);  
 }
}

Тогда вызывающий код в основном тот же.

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

1
ответ дан 29 November 2019 в 01:01
поделиться
Другие вопросы по тегам:

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