Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / PHP Продолжить выполнение кода после ошибки / 9 сообщений из 9, страница 1 из 1
27.04.2014, 06:03
    #38626886
ZardoZ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP Продолжить выполнение кода после ошибки
Ошибка генерируется так:
Код: php
1.
2.
3.
trigger_error('Error: ' . mysql_error($this->link) . '
Error No: ' . mysql_errno($this->link) . '
' . $sql);



Вывод текста я убрал. Но скрипт все равно стопорится, если происходит ошибка. При том блоком try она не ловится.

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
public function insertProxy($ip, $port) {
        try {
            $this->db_connection->query('INSERT INTO ' . DB_PREFIX . 'proxy_list (ip, port) VALUES ("' . $ip . '",' . $port . ')');
            echo 'При ошибке я не отображаюсь';
            return $this->db_connection->getLastId();
        }
        catch (Exception $e) {
            echo 'При ошибке я тоже не отображаюсь';
            var_dump($e);
        }
    }



На исключении я строю проверку уникальности ip. Все что уже есть должно игнорироваться. А оно встаёт и всё.
...
Рейтинг: 0 / 0
27.04.2014, 07:53
    #38626892
?
?
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP Продолжить выполнение кода после ошибки
...
Рейтинг: 0 / 0
28.04.2014, 04:05
    #38627289
ZardoZ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP Продолжить выполнение кода после ошибки
Так тоже пробовал - аналогичный результат. Видать еще что-то надо учесть.

Код: php
1.
2.
3.
4.
function silentErrorHandler($errno, $errstr) {
        echo 'При ошибке я отображаюсь';
        return true;
}




Код: php
1.
2.
3.
4.
5.
6.
7.
public function insertProxy($ip, $port) {
            set_error_handler('silentErrorHandler');
            $this->db_connection->query('INSERT INTO ' . DB_PREFIX . 'proxy_list (ip, port) VALUES ("' . $ip . '",' . $port . ')');
            echo 'При ошибке я не отображаюсь';
            restore_error_handler();
            return $this->db_connection->getLastId();
    }
...
Рейтинг: 0 / 0
28.04.2014, 06:03
    #38627296
sxq
sxq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP Продолжить выполнение кода после ошибки
Приведите конкретный текст ошибки, когда происходит остановка. Непонятно каким образом она генерируется, вероятно, в недрах $this->db_connection->query где-то.
Логичнее прерывания генерировать самостоятельно, а не отлавливать ошибки в ходе выполнения программы интерпретатором, тем более фатальные ошибки все равно вызовут остановку.
...
Рейтинг: 0 / 0
28.04.2014, 07:09
    #38627305
ZardoZ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP Продолжить выполнение кода после ошибки
sxq,

Выше приведен код как генерится ошибка (модуле mysql.php движка OpenCart), поэтому этот механизм я не могу изменить. Поэтому мне и надо проигнорировать уже брошенную ошибку, чтобы не создавать лишних запросов к БД для проверок.

Вот исходник метода, если вдруг так понятнее:
Код: 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.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
	public function query($sql, $iterator = false) {
		$resource = mysql_query($sql, $this->link);

		if ($resource) {
			if (is_resource($resource)) {
				$i = 0;
    	
				if ($iterator) {
					$data = new MySqlRowIterator($resource);
				} else {
					$data = array();
			
					while ($result = mysql_fetch_assoc($resource)) {
						$data[$i] = $result;
			
						$i++;
					}
					
					mysql_free_result($resource);
				}
				
				$query = new stdClass();
				$query->row = isset($data[0]) ? $data[0] : array();
				$query->rows = $data;
				$query->num_rows = $i;
				
				unset($data);
				
				return $query;	
    		} else {
				return true;
			}
		} else {
			trigger_error('Error: ' . mysql_error($this->link) . '
Error No: ' . mysql_errno($this->link) . '
' . $sql);
			exit();
    	}
  	}
...
Рейтинг: 0 / 0
28.04.2014, 07:15
    #38627306
ZardoZ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP Продолжить выполнение кода после ошибки
Ошибка как и должна быть:

авторNotice: Error: Duplicate entry '87.106.242.46' for key 'ip'
Error No: 1062
INSERT INTO proxy_list (ip, port) VALUES ("87.106.242.46",100) in /home/*****/mobichel.com/docs/mob_new/system/database/mysql.php on line 80
...
Рейтинг: 0 / 0
28.04.2014, 07:20
    #38627309
ZardoZ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP Продолжить выполнение кода после ошибки
Эх нельзя редактировать сообщения. Неудобно.

Если я перехватываю через set_error_handler, то вывод ошибки подавляется, но продолжение скрипта не происходит. Может проблема в OpenCart? Еще что-то влияет?
...
Рейтинг: 0 / 0
28.04.2014, 08:45
    #38627336
?
?
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP Продолжить выполнение кода после ошибки
ZardoZ
Код: php
1.
2.
3.
4.
			trigger_error('Error: ' . mysql_error($this->link) . '
Error No: ' . mysql_errno($this->link) . '
' . $sql);
			exit();

Ну после exit() вы продолжить выполнение никак не сможете
...
Рейтинг: 0 / 0
28.04.2014, 09:06
    #38627353
ZardoZ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP Продолжить выполнение кода после ошибки
авторНу после exit() вы продолжить выполнение никак не сможете

Вот и вправду прозрение, оказывается это псевдоним die (а я думал это псевдоним return). Тогда VQMod использую чтобы убрать эту строку... Главное чтобы сам OpenCart не посыпался при ошибках.
...
Рейтинг: 0 / 0
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / PHP Продолжить выполнение кода после ошибки / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]