Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
 Аватар для RosenR@t
136 / 136 / 7
Регистрация: 07.07.2010
Сообщений: 774

Логика работы try

27.10.2020, 08:19. Показов 1653. Ответов 9

Студворк — интернет-сервис помощи студентам
Здравствуйте. Не могу до конца понять логику работы try catch. Код:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$login=$_POST['login'];
$email=$_POST['email'];
$password=$_POST['password'];
$password2=$_POST['password2'];
 
 
try {
 
if ($password != $password2){
        throw new Exception('пароли не совпадают.');
}
 
...
 
}
 
  catch (Exception $e) {
  echo  '<div class="alert alert-danger" role="alert">'."Произошла ошибка: ";
  echo $e->getMessage();
  echo "</div>";
  exit;
}
Работает, при несовпадении введенных паролей появляется ошибка. Но, если в try добавить что-нибудь, то сообщение не появляется, например:

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
$login=$_POST['login'];
$email=$_POST['email'];
$password=$_POST['password'];
$password2=$_POST['password2'];
 
 
try {
 
if ($password != $password2){
        throw new Exception('пароли не совпадают.');
}
 
 
if ((strlen($password) < 6 || strlen($login) > 16)){
        throw new Exception('пароль слишком короткий или логин слишком длинный.');
}
...
 
}
 
  catch (Exception $e) {
  echo  '<div class="alert alert-danger" role="alert">'."Произошла ошибка: ";
  echo $e->getMessage();
  echo "</div>";
  exit;
}
Предупреждение "пароль слишком короткий или логин слишком длинный" появляется в форме сразу, после загрузки страницы.
Как это можно исправить? Что бы предупреждение появлялось только после ввода.

Добавлено через 9 минут
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
try {
 
if ($password != $password2){
        throw new Exception('пароли не совпадают.');
}
 
if ((strlen($password) < 6 || strlen($login) > 16)){
        throw new Exception('пароль слишком короткий или логин слишком длинный.');
}
 
// проверяем email
if (!valid_email($email)){
    throw new Exception(' недопустимый адрес электронной почты.');
}
 
...
}
 
  catch (Exception $e) {
  echo  '<div class="alert alert-danger" role="alert">'."Предупреждение: ";
  echo $e->getMessage();
  echo "</div>";
  exit;
}
А в данном случае, вообще предупреждения не выводятся... Что я делаю не правильно?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
27.10.2020, 08:19
Ответы с готовыми решениями:

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

Логика работы pastebin
Доброго времени суток!Подскажите пожалуйста, как на сайте https://pastebin.com/, реализована логика кнопки сохранения текста в...

Логика работы сервиса анализа позиций
Здравствуйте. Подскажите примерную логику работы сервисов анализа позиций, например http://xseo.in. Я читал что они работают на основе...

9
1310 / 1002 / 232
Регистрация: 01.10.2018
Сообщений: 3,896
27.10.2020, 09:27
Цитата Сообщение от RosenR@t Посмотреть сообщение
Предупреждение "пароль слишком короткий или логин слишком длинный" появляется в форме сразу, после загрузки страницы.
Здесь дело не в try/catch, а в разделении кода по методу запроса (GET/POST).

И никогда так не делайте:
PHP
1
2
3
4
$login=$_POST['login'];
$email=$_POST['email'];
$password=$_POST['password'];
$password2=$_POST['password2'];
Ну, или по крайней мере, пока не проверите существование указанных POST-параметров.

Добавлено через 7 минут
Цитата Сообщение от RosenR@t Посмотреть сообщение
echo "</div>";
exit;
</div> и все? С чего вы взяли, что браузер обязан обрабатывать всякие "огрызки", а не полноценные страницы?

И лучше не выполнять вывод непосредственно в catch. Поверните в этом блоке логику выполнения приложения таким образом, чтобы в результате выводилась соответствующая ошибка.
0
490 / 167 / 98
Регистрация: 23.01.2020
Сообщений: 324
27.10.2020, 09:33
RosenR@t, Здравствуйте, давайте я попробую объяснить как работает try...catch. Внутри блока try...catch не нужно вставлять throw, throw вставляется в других местах, например в функциях. Глянем на пример:

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
function comparePasswords($pass1, $pass2){
    if ($pass1 !== $pass2){
        throw new Exception("Пароли не совпадают");
    }
}
 
try{
    //задаем разные пароли
    comparePasswords("pass", "wrong");
    //Если не вылетит исключения тогда будет продолжено выполение кода
    echo "С паролями все хорошо";
}catch (Exception $ex){
    echo $ex->getMessage();
}
 
echo "<br>";
 
try{
    //А здесь уже пароли будут одинаковые
    comparePasswords("pass", "pass");
    //Если не вылетит исключения тогда можно продолжать
    echo "С паролями все хорошо";
}catch (Exception $ex){
    echo $ex->getMessage();
}
Прочтите подробнее: PHP исключения.
0
1310 / 1002 / 232
Регистрация: 01.10.2018
Сообщений: 3,896
27.10.2020, 09:43
Цитата Сообщение от ShaRpN00B Посмотреть сообщение
Внутри блока try...catch не нужно вставлять throw
Может, и не нужно, но можно. Это наиболее наглядный способ для первого ознакомления.

Цитата Сообщение от ShaRpN00B Посмотреть сообщение
throw вставляется в других местах, например в функциях
Когда вы вызываете эти функции внутри блока try, вы фактически вставляете в него throw Я к тому, что ваши слова могут быть неправильно поняты.
0
490 / 167 / 98
Регистрация: 23.01.2020
Сообщений: 324
27.10.2020, 09:47
estic, Прощу прощения, действительно я тут написал на скорую руку не обдумав))
0
 Аватар для RosenR@t
136 / 136 / 7
Регистрация: 07.07.2010
Сообщений: 774
27.10.2020, 10:11  [ТС]
estic, то есть нужно:
1. Проверить существуют ли переменные.
2. Выполнить вывод вне catch.
Не пойму как вывод сообщений на cathc организовать.
0
1310 / 1002 / 232
Регистрация: 01.10.2018
Сообщений: 3,896
27.10.2020, 10:51
Лучший ответ Сообщение было отмечено RosenR@t как решение

Решение

Ладно, не обращайте пока внимание на мои слова про вывод (то была дописка). В моем сообщении основное - это первое предложение:
Здесь дело не в try/catch, а в разделении кода по методу запроса (GET/POST).
Хотя с выводом, конечно, это тоже связано. Дело в том, что в ответ на POST-запрос при отсутствии критических ошибок лучше вовсе ничего не выводить, а делать перенаправление методом GET. Но, допустим, вы все же решили выводить ошибки пользовательского ввода непосредственно в ответ на POST-запрос, тогда логика может быть такой:
PHP
1
2
3
4
5
6
7
8
9
10
if ($_SERVER['REQUEST_METHOD']=='POST')
{
    try
...
    catch (Exception $e)
    {
        // можно пересохранить сообщение в более подходящем месте
        // или оставить это блок пустым
    }
}
И далее в шаблоне:
PHP/HTML
1
2
3
4
5
6
7
8
...
<?php if (isset($e)): ?>
<div class="alert alert-danger" role="alert">
    Предупреждение: <?= $e->getMessage() ?>
 
</div>
<?php endif; ?>
...
1
 Аватар для RosenR@t
136 / 136 / 7
Регистрация: 07.07.2010
Сообщений: 774
28.10.2020, 12:24  [ТС]
estic, спасибо.
Появился еще один вопрос. Пляшем дальше.

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function valid_email($addres) {
  // проверить адрес электронной почты 
  if (preg_match('[a-zA-Z0-9]+@[a-zA-Z0-9]+\.[a-zA-Z0-9]+$',$addres)){
  return true;
  }
  else {
  return false;
  }
 
try {
 
// проверяем email
if (!valid_email($email)) {
  throw new Exception('недопустимый адрес электронной почты.');
} 
...
}
И стоп. Дело, вроде бы, не в рег. выраж., но при такой проверке исключение 'недопустимый адрес электронной почты.' почему-то выдается постоянно, хоть тресни и хоть как вводи адрес эл. почты.
Подскажите, пожалуйста, в какую сторону смотреть?
0
Невнимательный
 Аватар для ft4l
3112 / 1290 / 359
Регистрация: 08.02.2013
Сообщений: 7,566
Записей в блоге: 2
28.10.2020, 12:54
Цитата Сообщение от RosenR@t Посмотреть сообщение
if (preg_match('[a-zA-Z0-9]+@[a-zA-Z0-9]+\.[a-zA-Z0-9]+$',$addres))
Выражение должно быть в огранничителях, после которых возможно добавляются модификаторы
например
'/^[a-z0-9]+@[a-z0-9]+\.[a-z0-9]+$/i'
или
'<^[a-z0-9]+@[a-z0-9]+\.[a-z0-9]+$>i'
или
'#^[a-z0-9]+@[a-z0-9]+\.[a-z0-9]+$#i' или в каких других
Должно было быть сообщение о этой ошибке
... если добавить в начале кода
PHP
1
2
error_reporting(-1);
ini_set('display_errors', 1);
Так-же само выражение не очень...
адрес может быть таким например a.b.c@aaa.net.ru или ещё каким .
тогда уж
PHP
1
if (filter_var($addres, FILTER_VALIDATE_EMAIL))
но тоже не все адреса поддерживает, если бывают адреса ...@сайт.рф
0
1310 / 1002 / 232
Регистрация: 01.10.2018
Сообщений: 3,896
29.10.2020, 16:18
RosenR@t, там функция не закрыта. И старайтесь избегать таких примитивных ветвлений, как в показанной функции: return (bool) preg_match(...);

Также смотрите, что вам выше написали: try/if рядом - это перебор (наверное, можно обойтись одним ветвлением). Вся прелесть исключений в том, чтобы в случае неполадок передавать управление с любого уровня вложенности алгоритмических структур/функций напрямую вверх в ближайший (по вложенности) блок catch:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function validate_email($address)
{
    // проверить адрес электронной почты 
    if (preg_match('...',$address))
    {
        return[ true];
    }
    throw new ValidationException;
}
 
try
{
    validate_email($email);
...
}
catch (ValidationException $e)
{}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.10.2020, 16:18
Помогаю со студенческими работами здесь

Логика работы if и while
Правильно ли я понимаю что если условия входа в цикл while выполнились он пройдет полностью до конца даже если во время исполнения условия...

Логика работы программы
Помогите доработать программу. Я застопорился на логике её работы и никак не могу заставить ее нормально работать. Ткните меня в мои...

События. Логика работы
Добрый вечер! Смотрел на MSDN (пишут много да дурного, а того, что надо нету), гуглил, но тоже безуспешно. Кто-то же должен это...

Логика работы присваивания
Добрый день. Только начал изучение python и вылез небольшой затык в логике работы, подскажите: &gt;&gt;&gt; a=85 &gt;&gt;&gt; b=15...

Логика работы переключателя на триггере
кто сможет нарисовать и обьяснить что к чему ? Алгебра логики .Переключатель на триггере который может включаться по 3 каналам 1...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru