Java всегда проходит по значению, без каких-либо исключений, когда-либо.
Итак, как же все могут быть смущены этим и считают, что Java проходит по ссылке или думает, что они пример Java, действующий как пропуск по ссылке? Ключевым моментом является то, что Java никогда не обеспечивает прямой доступ к значениям самих объектов , в любых обстоятельствах. Единственный доступ к объектам через ссылку к этому объекту. Поскольку объекты Java всегда всегда доступны через ссылку, а не напрямую, обычно говорят о полях и переменных и аргументах метода как объекты , когда педантично они являются только ссылками на объекты . Путаница проистекает из этого (строго говоря, неправильного) изменения в номенклатуре.
Итак, при вызове метода
int
, long
, и т. д.), пропуск по значению - фактическое значение примитива (например, 3). Итак, если у вас есть doSomething(foo)
и public void doSomething(Foo foo) { .. }
, два Foos скопировали ссылки , которые указывают на тот же объектов.
Естественно, что передача по значению ссылки на объект очень похожа на (и на практике неотличима от), передавая объект по ссылке.
Существует способ с использованием модуля 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 снизу стека (первое, что нужно вызвать).
Вы можете избежать нескольких предложений except
, и получить как номер строки, так и имя функции, в которой произошел сбой, и получить полезную информацию о том, почему команда не выполнена, как это:
import traceback
try:
-command A-
-command B-
-command C-
except ...:
print("The exception occurred as shown in the traceback below:")
traceback.print_exc()
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