Определите, какой оператор потерпел неудачу в многострочной попытке

Java всегда проходит по значению, без каких-либо исключений, когда-либо.

Итак, как же все могут быть смущены этим и считают, что Java проходит по ссылке или думает, что они пример Java, действующий как пропуск по ссылке? Ключевым моментом является то, что Java никогда не обеспечивает прямой доступ к значениям самих объектов , в любых обстоятельствах. Единственный доступ к объектам через ссылку к этому объекту. Поскольку объекты Java всегда всегда доступны через ссылку, а не напрямую, обычно говорят о полях и переменных и аргументах метода как объекты , когда педантично они являются только ссылками на объекты . Путаница проистекает из этого (строго говоря, неправильного) изменения в номенклатуре.

Итак, при вызове метода

  • Для примитивных аргументов (int, long, и т. д.), пропуск по значению - фактическое значение примитива (например, 3).
  • Для объектов пропускным значением является значение ссылка на объект .

Итак, если у вас есть doSomething(foo) и public void doSomething(Foo foo) { .. }, два Foos скопировали ссылки , которые указывают на тот же объектов.

Естественно, что передача по значению ссылки на объект очень похожа на (и на практике неотличима от), передавая объект по ссылке.

1
задан Raz Moshe 20 January 2019 в 09:41
поделиться

3 ответа

Существует способ с использованием модуля traceback, который извлекает информацию о трассировке:

import traceback
import sys

try:
    def func():
        raise TypeError:
    func()
except TypeError:
    e = sys.exc_info()[2]
    print(traceback.extract_tb(e)[0][3])

, который печатает

func()

Посмотрите на полный вывод traceback.extract_tb(e) как он дает список кортежей для каждого уровня в стеке вызовов. Каждый из них содержит (file, line_no, module_or_func, line_text), и вы можете изменить, какие значения вы используете. В этом примере я использовал line_text снизу стека (первое, что нужно вызвать).

0
ответ дан N Chauhan 20 January 2019 в 09:41
поделиться

Вы можете избежать нескольких предложений except, и получить как номер строки, так и имя функции, в которой произошел сбой, и получить полезную информацию о том, почему команда не выполнена, как это:

import traceback

try:
   -command A-
   -command B-
   -command C-
except ...:
   print("The exception occurred as shown in the traceback below:")
   traceback.print_exc()
0
ответ дан BoarGules 20 January 2019 в 09:41
поделиться
try:
    failedCmd = 'A'
    1/10 # -command A-
    failedCmd = 'B'
    1/0 # -command B-
    failedCmd = 'C'
    1*0 # -command C-
    failedCmd = ''
except:
   print("The exception occured during command " + failedCmd)

Выход

The exception occured during command B
0
ответ дан Filip Młynarski 20 January 2019 в 09:41
поделиться
Другие вопросы по тегам:

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