Я любовь FLOSS Weekly . Другой Подкаст Упрека, где Leo и Randal Schwartz берут интервью у фанатов с открытым исходным кодом. Моим фаворитом было их интервью с Dan Ingalls (Известность Smalltalk/Squeak). Я также наслаждался их интервью Richard Hipp (SQLite).
Когда я это делаю следующее
import sqlite3
dir(sqlite3)
Я не вижу ни одного из методов API резервного копирования .
Следовательно, ответ - нет; вы не можете получить доступ к API из модуля sqlite3. Похоже, что никто его не реализовал.
В некоторых случаях вам может потребоваться поэтапная очистка: например, когда вы открываете дескриптор файла, выделяете некоторую память, читаете из файла ... если чтение не удается, вам необходимо очистить malloc. Если malloc не работает, вам не нужно его очищать, но вам все равно нужно очистить дескриптор файла. С goto у вас может быть одна метка на этап очистки и переходить точно в нужную точку в зависимости от того, где произошла ваша ошибка.По моему мнению, слепое избегание GOTO из-за распространенной ненависти к нему более разрушительно, чем тщательное рассуждение случай его использования в индивидуальном порядке. Я использую эмпирическое правило: «делает ли это ядро Linux? Если да, то не может быть того плохого». Замените ядро linux любым другим хорошим примером современной разработки программного обеспечения.
читать из файла ... если чтение не удается, вам нужно очистить malloc. Если malloc не работает, вам не нужно его очищать, но вам все равно нужно очистить дескриптор файла. С goto у вас может быть одна метка на этап очистки и переходить точно в нужную точку в зависимости от того, где произошла ваша ошибка.По моему мнению, слепое избегание GOTO из-за распространенной ненависти к нему более разрушительно, чем тщательное рассуждение случай его использования в индивидуальном порядке. Я использую эмпирическое правило: «делает ли это ядро Linux? Если да, то не может быть того плохого». Замените ядро linux любым другим хорошим примером современной разработки программного обеспечения.
читать из файла ... если чтение не удается, вам нужно очистить malloc. Если malloc не работает, вам не нужно его очищать, но вам все равно нужно очистить дескриптор файла. С goto у вас может быть одна метка на этап очистки и переходить точно в нужную точку в зависимости от того, где произошла ваша ошибка.По моему мнению, слепое избегание GOTO из-за распространенной ненависти к нему более разрушительно, чем тщательное рассуждение случай его использования в индивидуальном порядке. Я использую эмпирическое правило: «делает ли это ядро Linux? Если да, то не может быть того плохого». Замените ядро linux любым другим хорошим примером современной разработки программного обеспечения.
но вам все равно нужно очистить дескриптор файла. С goto у вас может быть одна метка на этап очистки и переходить точно в нужную точку в зависимости от того, где произошла ваша ошибка.По моему мнению, слепое избегание GOTO из-за распространенной ненависти к нему более разрушительно, чем тщательное рассуждение случай его использования в индивидуальном порядке. Я использую эмпирическое правило: «делает ли это ядро Linux? Если да, то не может быть того плохого». Замените ядро linux любым другим хорошим примером современной разработки программного обеспечения.
но вам все равно нужно очистить дескриптор файла. С goto у вас может быть одна метка на этап очистки и переходить точно в нужную точку в зависимости от того, где произошла ваша ошибка.По моему мнению, слепое избегание GOTO из-за распространенной ненависти к нему более разрушительно, чем тщательное рассуждение случай его использования в индивидуальном порядке. Я использую эмпирическое правило: «делает ли это ядро Linux? Если да, то не может быть того плохого». Замените ядро linux любым другим хорошим примером современной разработки программного обеспечения.
На мой взгляд, слепое избегание GOTO из-за широко распространенной ненависти к нему вреднее, чем тщательное обоснование случая его использования в каждом конкретном случае. Я использую эмпирическое правило: «делает ли это ядро Linux? Если да, то не может быть того плохого». Замените ядро linux любым другим хорошим примером современной разработки программного обеспечения.
На мой взгляд, слепое избегание GOTO из-за широко распространенной ненависти к нему вреднее, чем тщательное обоснование случая его использования в каждом конкретном случае. Я использую эмпирическое правило: «делает ли это ядро Linux? Если да, то не может быть плохим». Замените ядро linux любым другим хорошим примером современной разработки программного обеспечения.
Помещение кода в отдельную функцию и использование return
для раннего выхода - еще один способ сделать это, с преимуществом простая интеграция кода возврата, указывающего на характер сбоя.
Хотя использование goto обычно не рекомендуется, В некоторых редких ситуациях, подобных вашей, лучшие практики не являются лучшими.
Итак, если goto дает наиболее четкий код, я бы использовал его. использование цикла while (true) для имитации goto - это что-то неестественное. Что вам действительно нужно, так это goto!
Почему бы не использовать серию операторов if
? Я обычно пишу это так, так как считаю его более понятным, чем цикл:
bool ok = true;
do_something();
if (was_an_error()) ok = false;
if (ok)
{
do_something_else();
if (was_an_error()) ok = false;
}
if (ok)
{
do_something_else_again();
if (was_an_error()) ok = false;
}
[...]
[Cleanup code]
Также, если вы работаете в соответствии со строгими стандартами кодирования, да, goto
, вероятно, будет запрещено, но часто так и break
и continue
, поэтому цикл не обязательно является обходным путем.
Используйте его, если вы не можете использовать goto по какой-либо причине
Я также думаю, что это также один из случаи, когда макросы не являются злом:
#define DO_ONCE for (int _once_dummy = 0; _once_dummy < 1; _once_dummy++)
Обычно GOTO считаются плохими, но в некоторых местах, где есть только прямые переходы через GOTO, они не так плохи. Люди избегают GOTO, как чумы, но хорошо продуманное использование GOTO иногда оказывается лучшим решением, ИМХО.
Я думаю, что это использование (для управления ресурсами) goto является хорошо.
Никогда не используйте цикл условий с постоянно истинным условием. Поскольку условие всегда истинно, зачем использовать условный цикл?
Постоянно истинные условия наиболее непосредственно представлены оператором goto.
Мне нравится подход while (1). Сам пользуюсь. Особенно, когда цикл может повторяться при продолжении, например, когда элемент обрабатывается внутри такого цикла, и это выполняется несколькими способами.
Хотя использование "goto" для ситуаций обработки ошибок довольно распространено, я все же предпочитаю решение "while" (или "do while"). В случае "goto" компилятор может гарантировать гораздо меньше вещей. Если вы сделаете опечатку в названии метки, компилятор вам не поможет. Если кто-то использует другой переход к другой метке в этом блоке, есть большая вероятность, что код очистки не будет вызван. Когда вы используете более структурированные конструкции управления потоком, вам всегда гарантируется, какой код будет выполняться после завершения цикла.
«break» понимает семантику области видимости блока, в то время как «goto» не обращает на это внимания. Другими словами, «while-break» может быть переведено на функциональные языки, такие как Lisp, с хвостовой рекурсией, «goto» - нет.
Я знаю, что мой стиль не самый крутой из возможных, но я предпочитаю его, потому что он не требует каких-либо специальных конструкций, краток и не слишком сложен для понимания:
error = (!error) && do_something1(); error = (!error) && do_something2(); error = (!error) && do_something3(); // Cleanup code