2011-06-24 9 views

Odpowiedz

8

Hiperłącza dla śledzenia stosu wyjątku są oparte na nazwie pliku i numerze linii podanym na końcu wiersza. Na przykład.

Stack trace: 

org.eclipse.jface.internal.databinding.provisional.BindingException: string property does not have a read method. 
at org.eclipse.jface.internal.databinding.internal.beans.JavaBeanObservableValue.doGetValue(JavaBeanObservableValue.java:102) 
at org.eclipse.jface.internal.databinding.internal.beans.JavaBeanObservableValue.setValue(JavaBeanObservableValue.java:83) 

Dla pierwszego śladu stosu, to na linii 102 w pliku JavaBeanObservableValue.java. Plik jest wyszukiwany w bieżącej ścieżce klasy, więc jeśli masz wiele klas o tej samej nazwie, zawsze znajduje się pierwszy ...

Innymi słowy, jeśli chcesz dodać rozszerzone hiperłącze na podstawie swojego przykładu, trzeba wydłużyć nieco widok konsoli ...

... co można zrobić z punktem rozszerzenia org.eclipse.ui.console.consolePatternMatchListeners. Łatwo jest używać tego punktu rozszerzenia i patrząc na przykład z JDT, powinieneś być w stanie sprawić, by twój przykład działał bez zbytniej pracy ...

7

Znacznie łatwiejsza metoda to oszukanie konsoli do tworzenia link dla ciebie. Format jest prosty:

System.out.println("(" + new TestBed().getClass().getSimpleName() + ".java:" + 18 + ")"); 

Oczywiście możesz podać typ klasy i numer linii w kodzie, jak chcesz.

+0

Aby uzyskać numer linii bieżącej linii, można rzucić i wyjątek i pobrać numer linii z tego. Prawdopodobnie nie jest to zadziwiająco wydajne, ale jeśli robisz coś takiego, wtedy wydajność nie jest prawdopodobnie tym, czego szukasz. –

+0

'Class.getName' wypisze kanoniczną nazwę klasy - z pakietami, więc to zadziała tylko, jeśli nie użyjesz pakietów (co jest wskaźnikiem złego kodu),' getSimpleName' powinno działać we wszystkich przypadkach – specializt

3

Lub, jeśli używasz log4j można skonfigurować appender tak:

<appender name="console" class="org.apache.log4j.ConsoleAppender"> 
    <param name="Target" value="System.out"/> 
    <layout class="org.apache.log4j.PatternLayout"> 
     <param name="ConversionPattern" value="%d{HH:mm:ss,SSS} %-5p %m (%F:%L) in %t%n"/> 
    </layout> 
</appender> 

Jeśli chcesz go do pracy w IntelliJ IDEA też można użyć:

 <param name="ConversionPattern" value="%d{HH:mm:ss,SSS} %-5p %m - at %c.%M(%F:%L) in %t%n"/> 
13

Może to jest jasne dla innych ludzi, ale uznałem, że inne odpowiedzi są mylące, chociaż poprawne. Konsola zaćmienie analizuje wzór (FileName.java:lineNumber) jest link do tej linii w tym pliku:

(MyFile.java:2) 

jak inne odpowiedzi podkreślić, że istnieje wiele sposobów na wyjście to do konsoli. Lokalizacja w linii nie ma znaczenia, jest to tylko dopasowanie wzoru. Jak pokazuje Colin Smith, log4j PatternLayout może użyć (%F:%L), aby uzyskać nazwę pliku i numer linii. Aby uzyskać programową nazwę i numer linii, zobacz programowo: this question.

Pytanie dotyczy linku do metody i myślę, że można użyć metody consolePatternMatchListeners zalecanej przez Tonny Madsen i opisanej bardziej szczegółowo w this question.

0

używam widoku konsoli niestandardowych i dodam IPatternMatchListener do MessageConsole z

console.addPatternMatchListener(...) 

Ważną zaletą korzystania słuchacza jest to, że zdarzenie zapewnia offset, który jest wymagany do tworzenia hiperłącza.

Punktem wyjścia dla realizacji IPatternMatchListener który tworzy hiperłącza można znaleźć tutaj:

https://github.com/mjwach/ErrorLinkyThing/blob/master/source/errorlinkything/ErrorLinkyPatternMatchListenerDelegate.java

Najtrudniejsza część wydaje się, aby uzyskać pełną ścieżkę pliku z nazwą pliku (nie użyj rejestratora).

Dzieło wokół wykorzystywane przez wtyczkę parasolka można znaleźć tutaj:

http://sunshade.cvs.sourceforge.net/viewvc/sunshade/net.sourceforge.sunshade/src/net/sourceforge/sunshade/util/FileUtil.java?view=markup

patrz metoda „dereferenceWindowsLink”

Nadal szukam alternatywy.

0

Oto prosty sposób wrapper na podstawie odpowiedzi wszystkich innych, które mogą być wykorzystane w dowolnym miejscu, aby uzyskać ciąg sformatowane tak, że konsola Eclipse będzie link do linii w dowolnym pliku gdzie getSourceCodeLine() nazywa. Odkryłem również, że drukowanie do System.err w środowisku Eclipse będzie widoczne pod numerem czerwonym.

public static String getSourceCodeLine() { 
    // An index of 1 references the calling method 
    StackTraceElement ste = new Throwable().getStackTrace()[1]; 
    return "(" + ste.getFileName() + ":" + ste.getLineNumber() + ")"; 
} 

public static void main(String[] args) 
    System.out.println("Here's a link to " + getSourceCodeLine()); 
    System.err.println("And a red link to " + getSourceCodeLine()); 
} 
Powiązane problemy