Как я могу получить трассировку стека JavaScript при выдаче исключения?

Для lolipop и более высокой версии Android вы можете использовать этот модифицированный класс RangeTimePickerDialog

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

public class RangeTimePickerDialog extends TimePickerDialog {

    private int minHour = -1;
    private int minMinute = -1;

    private int maxHour = 25;
    private int maxMinute = 25;

    private int currentHour = 0;
    private int currentMinute = 0;

    private Calendar calendar = Calendar.getInstance();
    private DateFormat dateFormat;


    public RangeTimePickerDialog(Context context, int dialogTheme, OnTimeSetListener callBack, int hourOfDay, int minute, boolean is24HourView) {
        super(context, callBack, hourOfDay, minute, is24HourView);
        currentHour = hourOfDay;
        currentMinute = minute;
        dateFormat = DateFormat.getTimeInstance(DateFormat.SHORT);
        fixSpinner(context, hourOfDay, minute, is24HourView);

        try {
            Class<?> superclass = getClass().getSuperclass();
            Field mTimePickerField = superclass.getDeclaredField("mTimePicker");
            mTimePickerField.setAccessible(true);
            TimePicker mTimePicker = (TimePicker) mTimePickerField.get(this);
            mTimePicker.setOnTimeChangedListener(this);
        } catch (NoSuchFieldException e) {
        } catch (IllegalArgumentException e) {
        } catch (IllegalAccessException e) {
        }
    }

    public void setMin(int hour, int minute) {
        minHour = hour;
        minMinute = minute;
    }

    public void setMax(int hour, int minute) {
        maxHour = hour;
        maxMinute = minute;
    }

    @Override
    public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {

        boolean validTime = true;
        if (hourOfDay < minHour || (hourOfDay == minHour && minute < minMinute)){
            validTime = false;
        }

        if (hourOfDay  > maxHour || (hourOfDay == maxHour && minute > maxMinute)){
            validTime = false;
        }

        if (validTime) {
            currentHour = hourOfDay;
            currentMinute = minute;
        }

        updateTime(currentHour, currentMinute);
        updateDialogTitle(view, currentHour, currentMinute);
    }

    private void updateDialogTitle(TimePicker timePicker, int hourOfDay, int minute) {
        calendar.set(Calendar.HOUR_OF_DAY, hourOfDay);
        calendar.set(Calendar.MINUTE, minute);
        String title = dateFormat.format(calendar.getTime());
        setTitle(title);
    }


    private void fixSpinner(Context context, int hourOfDay, int minute, boolean is24HourView) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { // android:timePickerMode spinner and clock began in Lollipop
            try {
                // Get the theme's android:timePickerMode
                //two modes are available clock mode and spinner mode ... selecting spinner mode for latest versions
                final int MODE_SPINNER = 2;
                Class<?> styleableClass = Class.forName("com.android.internal.R$styleable");
                Field timePickerStyleableField = styleableClass.getField("TimePicker");
                int[] timePickerStyleable = (int[]) timePickerStyleableField.get(null);
                final TypedArray a = context.obtainStyledAttributes(null, timePickerStyleable, android.R.attr.timePickerStyle, 0);
                Field timePickerModeStyleableField = styleableClass.getField("TimePicker_timePickerMode");
                int timePickerModeStyleable = timePickerModeStyleableField.getInt(null);
                final int mode = a.getInt(timePickerModeStyleable, MODE_SPINNER);
                a.recycle();
                if (mode == MODE_SPINNER) {
                    TimePicker timePicker = (TimePicker) findField(TimePickerDialog.class, TimePicker.class, "mTimePicker").get(this);
                    Class<?> delegateClass = Class.forName("android.widget.TimePicker$TimePickerDelegate");
                    Field delegateField = findField(TimePicker.class, delegateClass, "mDelegate");
                    Object delegate = delegateField.get(timePicker);
                    Class<?> spinnerDelegateClass;
                    if (Build.VERSION.SDK_INT != Build.VERSION_CODES.LOLLIPOP) {
                        spinnerDelegateClass = Class.forName("android.widget.TimePickerSpinnerDelegate");
                    } else {

                        spinnerDelegateClass = Class.forName("android.widget.TimePickerClockDelegate");
                    }
                    if (delegate.getClass() != spinnerDelegateClass) {
                        delegateField.set(timePicker, null); // throw out the TimePickerClockDelegate!
                        timePicker.removeAllViews(); // remove the TimePickerClockDelegate views
                        Constructor spinnerDelegateConstructor = spinnerDelegateClass.getConstructor(TimePicker.class, Context.class, AttributeSet.class, int.class, int.class);
                        spinnerDelegateConstructor.setAccessible(true);
                        // Instantiate a TimePickerSpinnerDelegate
                        delegate = spinnerDelegateConstructor.newInstance(timePicker, context, null, android.R.attr.timePickerStyle, 0);
                        delegateField.set(timePicker, delegate); // set the TimePicker.mDelegate to the spinner delegate
                        // Set up the TimePicker again, with the TimePickerSpinnerDelegate
                        timePicker.setIs24HourView(is24HourView);
                        timePicker.setCurrentHour(hourOfDay);
                        timePicker.setCurrentMinute(minute);
                        timePicker.setOnTimeChangedListener(this);
                    }
                }
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
    }
    private static Field findField(Class objectClass, Class fieldClass, String expectedName) {
        try {
            Field field = objectClass.getDeclaredField(expectedName);
            field.setAccessible(true);
            return field;
        } catch (NoSuchFieldException e) {} // ignore
        // search for it if it wasn't found under the expected ivar name
        for (Field searchField : objectClass.getDeclaredFields()) {
            if (searchField.getType() == fieldClass) {
                searchField.setAccessible(true);
                return searchField;
            }
        }
        return null;
    }
}
466
задан sg7 17 March 2018 в 18:36
поделиться

5 ответов

Редактирование 2 (2017):

Во всех современных браузерах можно просто звонить: console.trace(); (Ссылка MDN)

Редактирование 1 (2013):

А лучше (и более простой) решение, как указано в комментариях к исходному вопросу состоит в том, чтобы использовать stack свойство Error объект как так:

function stackTrace() {
    var err = new Error();
    return err.stack;
}

Это генерирует вывод как это:

DBX.Utils.stackTrace@http://localhost:49573/assets/js/scripts.js:44
DBX.Console.Debug@http://localhost:49573/assets/js/scripts.js:9
.success@http://localhost:49573/:462
x.Callbacks/c@http://localhost:49573/assets/js/jquery-1.10.2.min.js:4
x.Callbacks/p.fireWith@http://localhost:49573/assets/js/jquery-1.10.2.min.js:4
k@http://localhost:49573/assets/js/jquery-1.10.2.min.js:6
.send/r@http://localhost:49573/assets/js/jquery-1.10.2.min.js:6

Давание названия вызова функционируют наряду с URL, его функцией вызова, и так далее.

Оригинал (2009):

А изменил версию , этот отрывок может несколько помочь:

function stacktrace() { 
  function st2(f) {
    return !f ? [] : 
        st2(f.caller).concat([f.toString().split('(')[0].substring(9) + '(' + f.arguments.join(',') + ')']);
  }
  return st2(arguments.callee.caller);
}
679
ответ дан Iulian Onofrei 18 March 2018 в 04:36
поделиться
  • 1
    Я думаю, что это должно быть сделано принятым ответом. Один протест, если Вы хотите автосоединить свой пользовательский перехватчик проводом, объявляет его как @Bean в одном из эти @Configuration классы и добавляет, создают его через его бобовый метод. – Alexander Pogrebnyak 25 April 2013 в 14:16

Легче получить отслеживание стека на Firefox, чем это находится на IE, но существенно вот то, что Вы хотите сделать:

Обертка "проблематичная" часть кода в блоке попытки/выгоды:

try {
    // some code that doesn't work
    var t = null;
    var n = t.not_a_value;
}
    catch(e) {
}

при исследовании содержания "ошибочного" объекта, он содержит следующие поля:

e.fileName: исходный файл / страница, куда проблема прибыла из e.lineNumber: номер строки в файле/страница, где проблема возникла e.message: простое сообщение, описывающее, какая ошибка произошла e.name: тип ошибки, которая произошла, в примере выше его должен быть 'TypeError' e.stack: Содержит отслеживание стека, которое вызвало исключение

, я надеюсь, что это выручает Вас.

0
ответ дан eyelidlessness 18 March 2018 в 04:36
поделиться
  • 1
    Это звучит как хорошее спасибо, $time = strtotime ($phrase-> created_at); $time эха; дает мне его как это... 1270817634. Как я использую дату () функция с этим? – Chris Armstrong 9 April 2010 в 22:48

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

10
ответ дан Mark Biek 18 March 2018 в 04:36
поделиться
  • 1
    Да, парсинг даты в PHP вполне прилично формируется. Обратите внимание, что strtotime примет ПОЧТИ что-либо, что Вы бросаете в него. It' s дорогой, но довольно мощный. – Alex Mcp 9 April 2010 в 22:57

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

screenshot

25
ответ дан Boann 18 March 2018 в 04:36
поделиться
  • 1
    There' s также хорошая доступная библиотека PHPDate jQuery (через Google) – Alex Mcp 9 April 2010 в 22:58

Вы можете получить доступ к стеку ( stacktrace в Opera) свойствам экземпляра Error даже если вы его бросили. Дело в том, что вам нужно убедиться, что вы используете throw new Error (string) (не забудьте new вместо throw string .

Пример:

try {
    0++;
} catch (e) {
    var myStackTrace = e.stack || e.stacktrace || "";
}
7
ответ дан 22 November 2019 в 22:45
поделиться
Другие вопросы по тегам:

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