Старый школьный способ обработки этого состоял в том, чтобы сохранить this
в переменную перед each
, называемой «контекст» или «тот» или что-то в этом роде, а затем использовать эту переменную. К счастью, сегодня у нас есть функции стрелок , которые идеально подходят для этой ситуации, поскольку у них нет своего собственного this
контекста. s>
ОБНОВЛЕНИЕ: я забыл посмотреть вверх синтаксис для каждого . Похоже, вам нужен внутренний this
, поэтому функция стрелки не будет работать. Вместо этого вы можете решить вашу проблему, сохранив внешний this
в переменную:
export class TablesComponent implements OnInit {
tableIndexNumber = 1;
constructor() { }
change(col: number) {
const component = this;
$('#' + col).each(function() {
if ($(this).attr('class') === 'box') {
$(this).addClass('boxSelected');
component.tableIndexNumber++;
} else {
$(this).removeClass('boxSelected').addClass('box');
}
});
}
}
Можно установить отслеживание стека любого исключения, которое Вы хотите выдать:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class CarpTest {
public static void main(String[] args) {
new CarpTest().run();
}
public void run() {
methodThatCarps();
}
private void methodThatCarps() {
carp("Message");
}
private void carp(String message) {
RuntimeException e = new RuntimeException(message);
e.fillInStackTrace();
List<StackTraceElement> stack = new ArrayList<StackTraceElement>(Arrays.asList(e.getStackTrace()));
stack.remove(0);
e.setStackTrace(stack.toArray(new StackTraceElement[stack.size()]));
throw e;
}
}
Это распечатает следующий stacktrace во времени выполнения:
Exception in thread "main" java.lang.RuntimeException: Message
at CarpTest.methodThatCarps(CarpTest.java:18)
at CarpTest.run(CarpTest.java:14)
at CarpTest.main(CarpTest.java:10)
Обратите внимание, что, поскольку Вы хотите метод "карп", не появляется в stacktrace. Однако управление stacktraces shoud только быть сделанным с самой большой осторожностью.
Если Вы хотите использовать Исключение для управления потоком и что происходит впоследствии, хороший совет он для переопределения fillInStackTrace () метод:
public Throwable fillInStackTrace() {
return this;
}
В результате у Вас будет Исключение без stacktrace, и с уменьшенными издержками (заполняющий отслеживание стека занимает время).
Нет никакого пути к удалению функции броска от отслеживания стека. Целая цель отслеживания стека состоит в том, чтобы зарегистрировать путь исключения, настолько позволяющая функция для отказываний победила бы цель.
Единственным путем Вы могли измениться, это - то, при возврате исключения вместо того, чтобы бросить его. Но это вынуждает Вас зависеть от вызывающей стороны для знания для выдачи исключения.
throw die("someReason).fillInStackTrace();
Модифицированная функция
public static Exception die(String message) {
log(message);
...
return new MyException();
}
Править
Добавленный fillInStackTrace () звонят, чтобы гарантировать, что стек сбрасывается на грани броска.
http://java.sun.com/j2se/1.3/docs/api/java/lang/Throwable.html#Throwable ()
Mmm.. Вы могли разделить исключение на подклассы и переопределить все методы в нем и перенести исходное исключение. Внутренне, генерируйте новое отслеживание стека с помощью getStackTrace () метод от перенесенного исключения. Я не посмотрел на источник Исключения, но Вам, вероятно, даже не придется переопределить это много методов.
Основываясь на том, что ordnungswidrig говорит о настройке трассировки стека, и что неизвестно (Google) говорит о переопределении fillInStackTrace (), Я создал CarpException, который делает именно то, что я хочу. Обратите внимание, что я обнаружил, что мне пришлось удалить четыре кадра трассировки стека вместо одного, так как я собирал кадры из Throwable и Exception.
public class CarpException extends Exception {
@Override
public Throwable fillInStackTrace() {
super.fillInStackTrace();
StackTraceElement[] origStackTrace = getStackTrace();
StackTraceElement[] newStackTrace = new StackTraceElement[origStackTrace.length - 4];
System.arraycopy(origStackTrace, 4, newStackTrace, 0, origStackTrace.length - 4);
setStackTrace(newStackTrace);
return this;
}
}
Возможно, необходимо рассмотреть приближение к проблеме от другого направления. Вместо того, чтобы изменять отслеживание стека, почему не только имеют Ваш метод генератора исключения (die
в Вашем примере), возвращают исключение, а не бросают его? Затем Ваш вызов throw die();
.
Например:
// revised die() method:
public static MyException die(String message){
log(message);
//...
return new MyException();
}
// calling code:
throw die("a-whoopsie daisy!");
Теперь, предоставленный, throw die()
мог бы казаться немного неэстетическим, таким образом, Вы могли переименовать die()
кому: newException()
или что-то. Но требованию, чтобы метод обработки исключения не показывал в отслеживании стека, отвечают- die()
(или newException()
) возвраты перед исключением брошены и являются поэтому не частью стека, который будет прослежен.
Править: Мое плохое. Я провел так много времени, работая с C#, что я забыл, что в отслеживаниях стека исключительной ситуации Java сгенерированы при инстанцировании, где в отслеживаниях стека исключительной ситуации C#/.NET сгенерированы в разовом броском.
Таким образом, этот прием работал бы в C#, но не в Java.
Нет может сделать... Я пытался делать что-то вроде этого некоторое время назад (я пытался получить отслеживание стека для входа вызовов метода, прежде чем AOP существовал).
Отслеживание стека заполнено в том, когда исключение создается, и это сделано исходно. Для вещи я продолжал работать, я закончил тем, что читал отслеживание стека и посмотрел на второй элемент, но это не поможет Вам здесь...
Вы бросаете отслеживание стека только, чтобы смочь проанализировать его? В этом случае Вы могли назвать getStackTrace () методом на Исключении, которое возвращает StackTraceElement []. Там можно отфильтровать элементы, которые Вы не хотите (f.ex. "умереть" метод).
Вы могли бы полагать, что наличие Вашего метода получает Регистратор в качестве параметра к методу. Это позволило бы Вам управлять выводом входа на основе класса вызова.
Я отговорил бы от желания, чтобы Ваше исключение исключило эту часть отслеживания стека все же. Когда Вы уезжаете, и некоторый новый человек добирается для поддержания кода, не собирающийся ценить эту нестандартную обработку ошибок.