Я написал контроллер, который вот что делает:
Когда пользователь пишет в URL-адресе город Лондон:
http://mysitename/weather/London
Веб-сайт api.openweathermap.org предоставляет данные с помощью API, и пользователь получает данные о погоде в Лондоне на странице:
Контроллер WeatherPage.php, реализующий это:
<?php
namespace Drupal\weather\Controller; 
use Drupal\Core\Render\Markup;
use Drupal\Core\Controller\ControllerBase; 
use GuzzleHttp\Client;
class WeatherPage {
  public function getWeather($city) {
    $client = \Drupal::httpClient();
    try {
      $response = $client->get('http://api.openweathermap.org/data/2.5/weather?q='.$city.',&appid=здесь_мойаппайди&units=metric');
      $response_data = $response->getBody();  
      $data = json_decode($response_data );  
      return [
        '#markup' => Markup::create(
                                     '<h1>'  . $data->name . '</h1>' . 
                                     '<div>' . 'Temperature: ' . round($data->main->temp). '°C' . '</div>' .
                                     '<div>' . 'Сloudiness: ' . $data->clouds->all. '%' . '</div>' .
                                     '<div>' . 'Humidity: ' . $data->main->humidity. '%' . '</div>' .
                                     '<div>' . 'Pressure: ' . $data->main->pressure. ' mm' . '</div>' . 
                                     '<div>' . 'Wind: ' . $data->wind->speed. ' m/sec' . '</div>' 
                                    )
      ];
    } 
    catch (RequestException $e) {
      watchdog_exception('weather', $e->getMessage());
    }
  }
}
?>
  
Но если пользователь вводит в URL неправильное название города, города которого не существует, например 
Londonnnn, отображается ошибка:
GuzzleHttp\Exception\ClientException: Client error: `GET http://api.openweathermap.org/data/2.5/weather?q=L...` resulted in a `404 Not Found` response: {"cod":"404","message":"city not found"} in GuzzleHttp\Exception\RequestException::create() (line 113 of /var/www/html/vendor/guzzlehttp/guzzle/src/Exception/RequestException.php).
Это не хорошо. Пользователь не должен видеть ошибку когда он вводит в URL-адрес название несуществующего города, вместо этого он должен видеть на странице простое сообщение, например:
Город не найден
Чтобы решить эту проблему, я попытался добавить конструкцию `if-else` (возле строк которые я добавил я написал комментарии)<?php
namespace Drupal\weather\Controller; 
use Drupal\Core\Render\Markup;
use Drupal\Core\Controller\ControllerBase; 
use GuzzleHttp\Client;
class WeatherPage {
  public function getWeather($city) {
    $client = \Drupal::httpClient();
    try {
      $response = $client->get('http://api.openweathermap.org/data/2.5/weather?q='.$city.',&appid=здесь_мойаппайди&units=metric');
      if ($response->getStatusCode() == '200') {              /*добавил эту строку*/
      $response_data = $response->getBody();  
      $data = json_decode($response_data );  
      return [
        '#markup' => Markup::create(
                                     '<h1>'  . $data->name . '</h1>' . 
                                     '<div>' . 'Temperature: ' . round($data->main->temp). '°C' . '</div>' .
                                     '<div>' . 'Сloudiness: ' . $data->clouds->all. '%' . '</div>' .
                                     '<div>' . 'Humidity: ' . $data->main->humidity. '%' . '</div>' .
                                     '<div>' . 'Pressure: ' . $data->main->pressure. ' mm' . '</div>' . 
                                     '<div>' . 'Wind: ' . $data->wind->speed. ' m/sec' . '</div>' 
                                    )
      ];
     } 
     else {                                                /*добавил эту строку*/
       echo "City not found";                   /*добавил эту строку*/
     }                                                     /*добавил эту строку*/
    } 
    catch (RequestException $e) {
      watchdog_exception('weather', $e->getMessage());
    }
  }
}
?>
 
Но это не помогло и та же ошибка отображается.