Как я выдаю Исключение от объема вызывающей стороны?

Старый школьный способ обработки этого состоял в том, чтобы сохранить 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');
          }
        });
    }
}

5
задан skiphoppy 7 April 2009 в 21:17
поделиться

9 ответов

Можно установить отслеживание стека любого исключения, которое Вы хотите выдать:

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 только быть сделанным с самой большой осторожностью.

12
ответ дан 18 December 2019 в 07:32
поделиться

Если Вы хотите использовать Исключение для управления потоком и что происходит впоследствии, хороший совет он для переопределения fillInStackTrace () метод:

public Throwable fillInStackTrace() {
   return this;
}

В результате у Вас будет Исключение без stacktrace, и с уменьшенными издержками (заполняющий отслеживание стека занимает время).

4
ответ дан 18 December 2019 в 07:32
поделиться

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

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

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 ()

2
ответ дан 18 December 2019 в 07:32
поделиться

Mmm.. Вы могли разделить исключение на подклассы и переопределить все методы в нем и перенести исходное исключение. Внутренне, генерируйте новое отслеживание стека с помощью getStackTrace () метод от перенесенного исключения. Я не посмотрел на источник Исключения, но Вам, вероятно, даже не придется переопределить это много методов.

1
ответ дан 18 December 2019 в 07:32
поделиться

Основываясь на том, что 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;
  }
}
1
ответ дан 18 December 2019 в 07:32
поделиться

Возможно, необходимо рассмотреть приближение к проблеме от другого направления. Вместо того, чтобы изменять отслеживание стека, почему не только имеют Ваш метод генератора исключения (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.

1
ответ дан 18 December 2019 в 07:32
поделиться

Нет может сделать... Я пытался делать что-то вроде этого некоторое время назад (я пытался получить отслеживание стека для входа вызовов метода, прежде чем AOP существовал).

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

0
ответ дан 18 December 2019 в 07:32
поделиться

Вы бросаете отслеживание стека только, чтобы смочь проанализировать его? В этом случае Вы могли назвать getStackTrace () методом на Исключении, которое возвращает StackTraceElement []. Там можно отфильтровать элементы, которые Вы не хотите (f.ex. "умереть" метод).

0
ответ дан 18 December 2019 в 07:32
поделиться

Вы могли бы полагать, что наличие Вашего метода получает Регистратор в качестве параметра к методу. Это позволило бы Вам управлять выводом входа на основе класса вызова.

Я отговорил бы от желания, чтобы Ваше исключение исключило эту часть отслеживания стека все же. Когда Вы уезжаете, и некоторый новый человек добирается для поддержания кода, не собирающийся ценить эту нестандартную обработку ошибок.

0
ответ дан 18 December 2019 в 07:32
поделиться
Другие вопросы по тегам:

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