2012-07-02 31 views
5

Có ai biết nếu có cách tạo mã khác trong khối catch tự động tùy thuộc vào ngoại lệ không?Tùy chỉnh thử/bắt mẫu mã dựa trên ngoại lệ

Eclipse chức năng 'Đắm với try/catch' tạo ra một khối try/catch mà chỉ bao gồm bán phá giá một vết đống.

tôi đang làm một bó của những điều tương tự trong các mã và vì vậy hầu hết các trường hợp ngoại lệ của tôi sẽ đun sôi xuống lẽ ba hoặc lâu hơn các loại khác nhau. Tôi muốn có mã khối catch khác nhau cho mỗi một và có định dạng tự động eclipse dựa trên ngoại lệ.

Ví dụ: nếu mã của tôi tạo ra một RemoteConnectionException tôi muốn hiển thị hộp thoại cho người dùng kết nối lại. Nếu nó tạo ra một RemoteContentException tôi muốn đăng nhập nó.

(tôi thực hiện những lên.)

Cảm ơn trước

UPDATE: Tôi đã chọc xung quanh và có hai giải pháp tiềm năng.

1) Tôi đã tìm thấy một cái gì đó gọi là mã Plugin nhanh mà có thể làm những gì tôi đang tìm kiếm. http://fast-code.sourceforge.net/index.htm

2) Để xử lý cụ thể ngoại lệ, tôi có thể chỉ viết một trình xử lý ngoại lệ chung và sửa đổi mã khối catch để chuyển ngoại lệ cho thay vì in dấu vết ngăn xếp. Sau đó, mã java sẽ xác định hành động nào cần thực hiện dựa trên loại ngoại lệ.

+1

'catch (RemoteConnectionException & exc) {if (handleRemoteConnectionException (exc) == false) ném;}' –

Trả lời

4

Templating có giới hạn của nó. Tuy nhiên vấn đề của bạn có thể được giải quyết rất thanh lịch với Aspect. (http://www.eclipse.org/aspectj/) Chỉ cần tạo chú thích mới cho mọi loại "mẫu-trường hợp" bạn cần và sử dụng lời khuyên xung quanh.

Ps: không sử dụng printStackTrace() để syserr/sysout. Hiện có rất nhiều loại sản xuất, khai thác gỗ khung nhẹ .... pleeeaseee ... đừng lạm dụng nghèo ít System.out/err :)

EDIT:

Một số ví dụ cho một đăng nhập/tư vấn điểm chuẩn . (lưu ý:. Tôi đang sử dụng AOP mùa xuân cho các khía cạnh, và Lombok để dễ dàng truy cập vào các khung đăng nhập Mã getCurrentUser() là không thực sự liên quan ở đây, nó chỉ là để nhận được người dùng hiện hành từ Xuân An)

package com.XXXXXXXX.aspects; 

import lombok.extern.slf4j.Slf4j; 
import org.aspectj.lang.ProceedingJoinPoint; 
import org.aspectj.lang.annotation.Around; 
import org.aspectj.lang.annotation.Aspect; 
import org.aspectj.lang.annotation.Pointcut; 
import org.springframework.security.core.context.SecurityContextHolder; 
import org.springframework.security.core.userdetails.UserDetails; 
import org.springframework.stereotype.Component; 

@Component 
@Aspect 
@Slf4j 
public class LoggerAspect { 

    private final static String DOMAIN = "XXXXXXXX"; 

    private static String getCurrentUser() { 
     String username = "Unknown"; 
     try { 
      Object principal = SecurityContextHolder.getContext(). 
        getAuthentication(). 
        getPrincipal(); 
      if (principal instanceof UserDetails) { 
       username = ((UserDetails) principal).getUsername(); 
      } else { 
       username = principal.toString(); 
      } 
     } catch (Exception e) { 
     } 
     return username; 
    } 

    @Pointcut("within(com.XXXXXXXX.services..*)") 
    public void inServiceLayer() { 
    } 

    @Pointcut("execution(* getMatcherInfo(..)) || execution(* resetCounter(..))") 
    public void notToAdvise() { 
    } 

    @Around("com.XXXXXXXX.aspects.LoggerAspect.inServiceLayer() && !com.XXXXXXXX.aspects.LoggerAspect.notToAdvise()") 
    public Object doLogging(ProceedingJoinPoint pjp) 
      throws Throwable { 
     long start = System.nanoTime(); 
     StringBuilder sb = new StringBuilder(DOMAIN); 
     sb.append('/'). 
       append(getCurrentUser()). 
       append(" accessing "). 
       append(pjp.getSignature(). 
       getDeclaringTypeName()). 
       append('.'). 
       append(pjp.getSignature(). 
       getName()); 
     log.trace("START: " + sb.toString()); 
     Object retVal = pjp.proceed(pjp.getArgs()); 
     long duration = System.nanoTime() - start; 
     log.trace("STOP: " + duration/1000000 + " msec. " + sb.toString()); 
     return retVal; 
    } 
} 
+0

Loại bỏ dấu vết ngăn xếp in ngu ngốc đó chính xác là lý do tại sao tôi muốn tùy chỉnh mẫu.^_^ Tôi đã hoạt động được hơn một thập kỷ và tôi kinh khủng về việc các nhà phát triển thường xuyên sử dụng một đống dấu vết khi họ xử lý ngoại lệ. Tôi có thể hiểu nó nếu nó là một cái gì đó hoàn toàn bất ngờ nhưng bạn biết, khi bạn đang truy cập một tập tin ví dụ. Có một số trường hợp lỗi dự kiến ​​được xử lý dễ dàng.^ _^ – TheSporkboy

+0

Aspect là gì? Aspect4j? Tôi đang tìm kiếm nó nhưng những gì tôi thấy tôi không chắc chắn là những gì bạn đang nói về. – TheSporkboy

+0

@ user1497207: đã thêm liên kết khía cạnh vào câu trả lời –

0

Tôi không chắc chắn nếu có một tùy chọn có sẵn trong nhật thực. Tôi đã sử dụng surround với tùy chọn try/catch cho đôi khi bây giờ và nó luôn đổ đường mặc định e.printStackTrace() trong khối catch cho Exception e.

+0

Bạn có thể thay đổi mẫu nhưng không thể làm cho nó ngoại lệ cụ thể. Tôi thường thay đổi nó thành cái gì đó mang lại cho tôi lỗi biên dịch (vì vậy mà tôi buộc phải thêm một khối catch) –

Các vấn đề liên quan