Java如何让详细的报错信息输出到前端显示?

如何将详细的报错信息输出到前端界面上,具体到哪一行代码,代码中的哪一个方法不能使用。
前端显示的方法是c.getPlayer().dropMessage(内容);

img

现在显示的是java.lang.NoSuchMethodException: No such function action
怎么改动一下,我想让他显示具体是哪一行中的哪一个内容报错。

img


看你要输出什么级别,info,error,debug

使用 printStackTrace() 方法:

try {
    // 可能会抛出异常的代码
} catch (Exception e) {
    e.printStackTrace();
}



public class Main {
    public static void main(String[] args) {
        try {
            // 这里是可能会抛出异常的代码
            System.out.println(nonExistentMethod());
        } catch (Exception e) {
            // 这里会捕获并处理异常
            e.printStackTrace();
        }
    }

    public static void nonExistentMethod() throws Exception {
        // 这里调用一个不存在的函数,将会抛出异常
        int result = nonExistentFunction();
        System.out.println(result);
    }

    public static int nonExistentFunction() throws Exception {
        // 这里调用一个不存在的函数,将会抛出异常
        int result = nonExistentFunction2();
        return result;
    }

    public static int nonExistentFunction2() throws Exception {
        throw new Exception("This function doesn't exist");
    }
}
catch (Exception e) {
    e.printStackTrace();
}
public static void main(String[] args) {
    try {
        int a = 0;
        int b = 1;
        System.out.println(b/a);
    }catch (Exception e){
        StringWriter sw = new StringWriter();
        e.printStackTrace(new PrintWriter(sw,true));
        String infomsg = sw.toString();
        //输出带有代码报错位置的报错信息
        System.out.println(infomsg);
    }
}

执行结果如下

img

img

你可以将catch中的infomsg放到你要返回的数据中,这样前端就能正常显示了
可行麻烦给个采纳谢谢

你试试这样写一下;

try {
    // 可能会产生异常的代码
} catch (Exception e) {
    c.getPlayer().dropMessage("错误详细在: " + e.toString());
}

【以下回答由 GPT 生成】

问题回答:

要将详细的报错信息输出到前端界面上,可以通过以下步骤来实现:

  1. 在前端界面上创建一个用于显示报错信息的组件,比如一个文本框或者一个弹出窗口。

  2. 在后端的Java代码中,使用try-catch块来捕捉异常。在catch块中,可以将详细的报错信息存储到一个字符串变量中。

  3. 在catch块中,将这个报错信息发送给前端界面。可以使用服务端推送技术,比如WebSocket来向前端发送消息,或者通过接口将报错信息传递给前端。

下面是一个示例代码,展示了如何实现这个需求:

// 在 Java 代码中捕捉异常并将详细报错信息存储到一个字符串变量中
try {
    // 可能会出现异常的代码
} catch (Exception e) {
    // 将详细报错信息存储到一个字符串变量中
    StringWriter sw = new StringWriter();
    PrintWriter pw = new PrintWriter(sw);
    e.printStackTrace(pw);
    String detailedErrorMessage = sw.toString();

    // 将详细报错信息发送给前端界面
    // 通过WebSocket发送给前端
    // 例如,使用https://github.com/TooTallNate/Java-WebSocket这个库
    WebSocketClient client = new WebSocketClient(new URI("ws://localhost:8080/"));
    client.connect();
    client.send(detailedErrorMessage);
    client.close();

    // 或者通过接口将报错信息传递给前端
    // 例如,在Spring Boot应用中,可以定义一个@Controller和一个@GetMapping方法
    // 在方法中将报错信息以JSON格式返回给前端
}

// 在前端界面上显示报错信息
// 可以通过WebSocket接收报错信息
// 或者在接口调用的回调函数中处理报错信息
// 例如,在JavaScript中,使用WebSocket API或fetch API来接收报错信息并在前端界面上显示

这个示例代码利用了Java提供的异常处理机制,将详细的报错信息存储到一个字符串变量中,然后通过WebSocket或接口的方式将报错信息发送给前端界面。然后,前端界面可以通过WebSocket API或fetch API来接收报错信息,并在界面上进行显示。

请注意,示例代码中的具体实现方式可能需要根据你的项目需求和技术栈进行相应的调整。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

可以将异常堆栈中的所有信息转换成字符串返回给前端:

import java.io.PrintWriter;
import java.io.StringWriter;

try {
  // 可能会抛出异常的代码块
} catch (Exception e) {
  StringWriter sw = new StringWriter();
  PrintWriter pw = new PrintWriter(sw);
  e.printStackTrace(pw);
  String exceptionAsString = sw.toString();
  // 使用exceptionAsString进行处理
}

可以自定义一个异常拦截器,实现异常信息的重写。

蛮多人回复的啊,首先我根本不知道他想干嘛
为了获取发生错误的行号,你需要使用 Java 的异常对象的堆栈跟踪信息(StackTrace)。以下是一个示例代码,演示如何获取发生错误的行号:

try {
    // 尝试执行代码
    // ...
} catch (NoSuchMethodException e) {
    if (c.getPlayer() != null && c.getPlayer().isGM()) {
        // 如果玩家不为空且是GM,执行以下操作
        String errorMessage = "[系统提示]NPC " + cm.getNpc() + "脚本错误:"
                + e.getMessage();

        StackTraceElement[] stackTrace = e.getStackTrace();
        for (StackTraceElement element : stackTrace) {
            if (element.getFileName() != null && element.getFileName().endsWith(".java")) {
                // 获取发生错误的 Java 类文件名和行号
                errorMessage += "\n错误位置:" + element.getFileName() + ":" + element.getLineNumber();
                break; // 获取第一个 Java 类文件的错误位置
            }
        }

        c.getPlayer().dropMessage(errorMessage);
    }
}

在这段代码中,我们遍历异常的堆栈跟踪信息,检查每个堆栈元素的文件名是否以 ".java" 结尾,以便找到发生错误的 Java 类文件。如果找到匹配的元素,我们使用 element.getFileName()element.getLineNumber() 获取文件名和行号,并将其拼接到错误提示消息中。

请注意,这种方法只能获取到大致的错误位置,因为异常的堆栈跟踪信息可能包含多个方法调用和类文件。如果需要更精确的错误定位,可能需要更复杂的调试工具和技术。

希望这能满足你的需求。如果你有其他问题,请随时提问。

java报错信息在页面显示的方法

java报错信息在页面显示的方法:首先自定义异常类;然后在service层的抛出异常类,controller类继承主异常类;接着定义的主异常类,里面可以写多个自己定义的异常类;最后完成信息类代码。

java报错信息在页面显示的方法:

1、自定义异常类

public class ProdProcessOrderException extends RuntimeException {
private static final long serialVersionUID = 1L;
public ProdProcessOrderException(String message) {
super(message);
}
}
2、service层的代码

@Service
public class GeneralDpPpOrderServiceImpl implements GeneralDpPpOrderService {
public ResponseEntity<byte[]> downLoadExcel(GeneralDpPpOrder generalDpPpOrder) {
//.........
//省略代码
if (pOrderRouting == null) {
//此处抛出异常
throw new ProdProcessOrderException("当前门板流程单没有设置生产工艺.");
}
}
}
service层的抛出异常类

3、controller层的代码

@RestController
@RequestMapping("/api/mes/gene-dp-pp-order")
public class GeneralDpPpOrderController extends ExceptionResponse{ //继承主异常类
@Autowired
private GeneralDpPpOrderService generalDpPpOrderService;
@RequestMapping(value = "/download-excel", method = RequestMethod.PUT, consumes = "application/json;charset=UTF-8", produces = "application/xls")
public ResponseEntity<byte[]> downLoadExcel(@RequestBody GeneralDpPpOrder gdp) {
return generalDpPpOrderService.downLoadExcel(gdp);
}
controller类继承主异常类

4、主异常类代码

public abstract class ExceptionResponse {
@ExceptionHandler(ProdProcessOrderException.class)
@ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR)
public SystemMessage prodProcessOrderException(ProdProcessOrderException e) {
return new SystemMessage(500, e.getMessage());
}
}
定义的主异常类,里面可以写多个自己定义的异常类

5、信息类代码

public class SystemMessage {
private int code;
private String message;
public SystemMessage(int code, String message) {
super();
this.code = code;
this.message = message;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
通过以上五步,就可以把后台抛出的异常信息,在前端页面显示了

重写异常,再把记录写出

你可以在catch里面获取到错误的信息,每当报错的时候,把这个错误信息返回到一个专门显示错误信息的页面。

现在的 + 拼接是没有问题的,最终会调用到 Throwable 的 detailMessage属性;
这里可以先在 catch 内打个断点,看看异常是否有具体的message信息,有可能是通过无参构造函数创建的对象,直接就没有详细的异常信息。

语法有问题,e.printStackTrace();是无返回值的,所以不能和字符串进行拼接。

e.printStackTrace()
改为:
e.getMessage()