Бросок указателей является, вероятно, не хорошей вещью, поскольку он усложняет владение брошенного объекта. Исключения типа класса, вероятно, лучше, чем основные принципы просто, потому что они могут содержать больше информации о причине исключения.
В использовании иерархии классов или иерархии классов там несколько вопросов, которые необходимо рассмотреть:
И конструктор копии и деструктор объекта исключения никогда не должны выдавать исключение. Если они делают Вы - программа, сразу завершится. (ISO 15.5/1)
, Если Ваши объекты исключения имеют базовые классы, то используйте общедоступное наследование.
обработчик А будет только выбран для полученного к базовому классу, если базовый класс будет доступен . (ISO 15.3/3)
Наконец, (для всех типов исключительной ситуации) гарантируют, что бросаемое выражение не может самостоятельно привести к выданному исключению.
, Например:
class Ex {
public:
Ex(int i)
: m_i (i)
{
if (i > 10) {
throw "Exception value out of range";
}
}
int m_i;
};
void foo (bool b) {
if (! b) {
// 'b' is false this is bad - throw an exception
throw Ex(20); // Ooops - throw's a string, not an Ex
}
}
Вы можете пропатчить его для желаемого поведения. Например, вот полный сценарий, который добавляет команду «reset_list» или «rl» в pdb:
import pdb
def Pdb_reset_list(self, arg):
self.lineno = None
print >>self.stdout, "Reset list position."
pdb.Pdb.do_reset = Pdb_reset_list
pdb.Pdb.do_rl = Pdb_reset_list
a = 1
b = 2
pdb.set_trace()
print a, b
Можно предположить, что обезьяна внесет исправления в стандартную команду list
, чтобы не сохранять историю белья.
редактировать: А вот такой патч:
import pdb
Pdb = pdb.Pdb
Pdb._do_list = Pdb.do_list
def pdb_list_wrapper(self, arg):
if arg.strip().lower() in ('r', 'reset', 'c', 'current'):
self.lineno = None
arg = ''
self._do_list(arg)
Pdb.do_list = Pdb.do_l = pdb_list_wrapper
a = 1
b = 2
pdb.set_trace()
print a, b
Я не думаю, что есть способ его выключить. Меня это достаточно раздражало, что однажды я пошел искать в исходный код pdb, чтобы увидеть, есть ли недокументированный синтаксис, но я не нашел его.
На самом деле нужен синтаксис, означающий «Перечислить строки рядом с текущим указателем выполнения».
Я не думаю, что есть способ полностью провести сравнение последовательностей переменной длины в директивах препроцессора. Возможно, вы могли бы сделать следующее:
#define USER_JACK 1
#define USER_QUEEN 2
#define USER USER_JACK
#if USER == USER_JACK
#define USER_VS USER_QUEEN
#elif USER == USER_QUEEN
#define USER_VS USER_JACK
#endif
Или вы могли бы немного переформатировать код и использовать код Си вместо него.
-121--838436-Пример, я думаю, многие люди, задающие этот вопрос, после этого. Если вы находитесь в каталоге, в который должно быть выгружено содержимое репозитория git, выполните команду
git clone git@github.com:whatever .
The «». в конце указывает текущую папку в качестве папки извлечения.
-121--1896281- Если вместо pdb используется epdb , можно использовать «l» для перехода вперед, как в pdb, но затем «l». возвращается к текущему номеру строки, а «l-» проходит обратно через файл. Можно также использовать до # для продолжения до заданной строки. Epdb предлагает кучу других симпатий тоже. Требуется удаленная отладка? Попробуйте serve ()
вместо набор _ trace ()
, а затем telnet в (порт 8080 является портом по умолчанию).
import epdb
epdb.serve()