Исключение повышения по сравнению с возвратом Ни один в функциях?

Другой полезный плагин для разработки C cscope Так же, как Ctags позволяет Вам перейти к определениям, переходам Cscope к вызов функции.

, Если у Вас есть cscope в Вашем ~/bin/каталог, добавьте следующее к своему .vimrc и используйте g^] для движения в функцию вызова (см.: помогите cscope).

if has("cscope")
    set csprg=~/bin/cscope
    set csto=0
    set cst
    set nocsverb
    " add any database in current directory
    if filereadable("cscope.out")
        cs add cscope.out
        " else add database pointed to by environment
    elseif $CSCOPE_DB != ""
        cs add $CSCOPE_DB
    endif
endif

Почти забыл... Так же, как ctags - необходимо генерировать (и периодически обновлять), база данных. Я использую следующий сценарий

select_files > cscope.files
ctags -L cscope.files
ctags -e -L cscope.files
cscope -ub -i cscope.files

, Где 'select_files' является другим сценарием, который извлекает список C и заголовочных файлов от Make-файла. Таким образом, я индексирую только файлы, на самом деле используемые проектом.

72
задан martineau 21 May 2018 в 16:06
поделиться

4 ответа

Это действительно вопрос семантики. Что означает foo = latestpdf (d) , означает ?

Разве вполне разумно, что нет последнего файла? Тогда конечно, просто верните None.

Вы ожидаете, что всегда найдете последний файл? Поднимите исключение. И да, можно повторно создать более подходящее исключение.

Если это просто общая функция, которая должна применяться к любому каталогу, я бы сделал первое и вернул None. Если каталог, например, предназначен для использования в качестве определенного каталога данных, содержащего известный набор файлов приложения, я бы вызвал исключение.

81
ответ дан 24 November 2019 в 12:44
поделиться

Я обычно предпочитаю обрабатывать исключения внутренне (т.е. try / except внутри вызываемой функции, возможно, возвращая None), потому что python динамически типизируется. В общем, я так или иначе считаю это суждением, но в динамически типизированном языке есть небольшие факторы, которые склоняют чашу весов в пользу отказа от передачи исключения вызывающей стороне:

  1. Любой, кто вызывает вашу функцию, не уведомляется об исключениях, которые могут быть созданы. Это становится своего рода искусством знать, за каким исключением вы ищете (и общих блоков, кроме блоков, следует избегать).
  2. если val равно None немного проще, чем , за исключением ComplicatedCustomExceptionThatHadToBeImportedFromSomeNameSpace . Серьезно, я ненавижу напоминать о вводе из django.core. исключения импортируют ObjectDoesNotExist в начало всех моих файлов django, чтобы справиться с действительно распространенным вариантом использования. В статически типизированном мире позвольте редактору сделать это за вас.

Честно говоря, это всегда суждение, и описываемая вами ситуация, когда вызываемая функция получает ошибку, которую она не может помочь, является ошибкой. отличный повод для повторного создания значимого исключения. У вас есть точная правильная идея, но если вы не исключение, оно предоставит более значимую информацию в трассировке стека, чем

AttributeError: 'NoneType' object has no attribute 'foo'

, что в девяти случаях из десяти - это то, что увидит вызывающий, если вы вернете необработанное None, не не беспокойтесь.

(Все это заставляет меня желать, чтобы исключения python имели атрибуты cause по умолчанию, как в java,

5
ответ дан 24 November 2019 в 12:44
поделиться

В общем, я бы сказал, что должно быть создано исключение, если произошло что-то катастрофическое, из которого невозможно восстановить (т.е. ваша функция имеет дело с каким-то интернет-ресурсом, к которому невозможно подключиться), и вы должен возвращать None, если ваша функция действительно должна что-то возвращать, но ничего не следует возвращать (например, «None», если ваша функция пытается сопоставить подстроку в строке).

2
ответ дан 24 November 2019 в 12:44
поделиться

Я хотел бы сделать пару предложений, прежде чем отвечать на ваш вопрос, так как он может ответить на ваш вопрос.

  • Всегда называйте свои функции описательными. latestpdf мало что значит для всех, но просмотр вашей функции latestpdf () получает последнюю версию pdf. Я бы посоветовал вам назвать его getLatestPdfFromFolder (папка) .

Как только я это сделал, стало ясно, что он должен возвращать .. Если нет PDF-файла, вызовет исключение. Но подождите ...

  • Держите функции четко определенными. Поскольку неясно, что должен делать somefuc, и (очевидно) не очевидно, как это связано с получением последней версии pdf, я бы посоветовал вам убрать его. Это делает код более читабельным.

for folder in folders:
   try:
       latest = getLatestPdfFromFolder(folder)
       results = somefuc(latest)
   except IOError: pass

Надеюсь, это поможет!

7
ответ дан 24 November 2019 в 12:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: