Надлежащее использование попытки.. выгода

Используйте stat -s. Он печатает поля в том же порядке, но с метками (и без имени файла):

:; stat -s /etc/man.conf | fmt
st_dev=16777220 st_ino=641593 st_mode=0100644 st_nlink=1 st_uid=0
st_gid=0 st_rdev=0 st_size=4574 st_atime=1547885737 st_mtime=1500152545
st_ctime=1512806119 st_birthtime=1500152545 st_blksize=4194304
st_blocks=0 st_flags=32

Ваше первое загадочное поле - st_rdev, «тип устройства, для специального файлового индекса». Поскольку мы не регистрируем файл устройства, это ноль.

Ваше второе загадочное поле - st_birthtimespec, «время создания файла (рождения)» (см. Справочную страницу stat(2)). Это дарвинское 64-битное расширение.

Ваш 4096 не размер файла в байтах. Это st_blksize, «оптимальный размер блока для ввода / вывода». В моем примере это 4194304. Возможно, ваш файл находится в файловой системе HFS +. Мой находится в файловой системе APFS.

Ваше третье загадочное поле - st_flags, «пользовательские флаги для файла». У тебя ноль, поэтому флаги не установлены. В моем примере (/etc/man.conf) установлено UF_COMPRESSED.

В чем разница между st_dev и st_rdev?

Поле st_dev относится к устройству (жесткий диск / раздел / что угодно), содержащему файл. Поле st_rdev для файлов устройств сообщает ядру, какое устройство представляет сам файл. Попробуйте запустить stat для некоторых файлов устройств в /dev, например, /dev/null и /dev/rdisk0, чтобы увидеть ненулевые значения st_rdev.

Многие, я не нашел правильную страницу руководства (ни man stat, ни man lstat). Есть ли официальная документация, которая подробно объясняет каждое поле статистики? Где я могу его найти?

Используйте man 1 stat, чтобы узнать о флагах программы командной строки stat, например, о флаге -s, который я использовал. Затем используйте man 2 stat и ваш любимый поисковик, чтобы узнать, что означают поля.

6
задан Greg Dean 14 October 2008 в 13:26
поделиться

7 ответов

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

Следует иметь в виду это try/catch на языках как C++ и Java являются очень дорогими из-за всего состояния, которое они должны сохранить и восстановить. Python, с другой стороны, имеет очень дешевые исключения, и они положительно поощряют Вас использовать a try/except для простой проверки. Но несмотря на это, ловя все и притворяясь это - один тип исключения, все еще плохо.

10
ответ дан 8 December 2019 в 12:24
поделиться
//First let's do the checks.
if(!isset($this->dbfields[$var]))
    throw new FieldNotFoundException($var);
//Now we're in the clear!
return $this->dbfields[$var];
4
ответ дан 8 December 2019 в 12:24
поделиться

Ловлю "Исключения", большую часть времени, не считают хорошей практикой из двух, которые Вы отобразили, я буду использовать опцию 1.

Ловля всех исключений может скрыть другое исключение и замаскировать его как FileNotFoundException.

3
ответ дан 8 December 2019 в 12:24
поделиться

Я предпочитаю первый, но если dbfields [$var] бросают что-то разумное при доступе к несуществующему элементу затем я предпочел бы просто возвращать его без проверки.

Мне особенно не нравится изменять тип исключительной ситуации, если у меня нет серьезного основания - также, если Вы делаете, удостоверьтесь, что попытались сохранить исходное исключение и отслеживание стека.

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

"... или что-то еще в целом?"

Ни один не очень хорош, таким образом, что-то еще было бы соответствующим.

Зафиксируйте версию 2 для ловли корректного исключения, не каждого возможного исключения. Сообщение, что как опция 3. Я буду upvote что-то, что ловит определенное исключение вместо Exception.

0
ответ дан 8 December 2019 в 12:24
поделиться

Просто перечитайте свое объяснение.

Я предполагаю, что Ваш метод там в № 1 собирается поймать любые исключения, которые могли бы быть выданы и просто возвратить bool. Мне определенно не нравится ловля универсального исключения большую часть времени, таким образом, № 2 не был бы моим выбором.

0
ответ дан 8 December 2019 в 12:24
поделиться

Это далеко от агностика языка.

Некоторые языки не бросят ошибки для доступа к несуществующим полям, и предпочтительный шаблон во многом зависит от реализаций массивов, таблиц, объектов, и т.д.

0
ответ дан 8 December 2019 в 12:24
поделиться
Другие вопросы по тегам:

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