Java如何抛出自定义异常?5步实现精准错误处理

Random Image

Java如何抛出自定义异常?5步实现精准错误处理

1. 理解Java异常体系

Java异常分为Checked Exception(编译时异常)Unchecked Exception(运行时异常)。自定义异常通常继承这两种基础类型:
业务异常推荐继承`Exception`(Checked)
非关键异常可继承`RuntimeException`(Unchecked)

体系结构示例:
“`java
Throwable
├─ Exception (Checked)
│ └─ YourCustomException
└─ RuntimeException (Unchecked)
└─ YourBusinessException
“`

2. 创建自定义异常类

通过继承基础异常类实现,建议添加构造方法重载

“`java
// 继承RuntimeException的未检查异常
public class PaymentFailedException extends RuntimeException {
// 带错误信息的构造器
public PaymentFailedException(String message) {
super(message);
}

// 带错误信息和原因的构造器(重点:异常链
public PaymentFailedException(String message, Throwable cause) {
super(message, cause);
}
}
“`

3. 抛出异常的最佳实践

在业务逻辑中通过`throw`触发异常,推荐添加详细错误上下文

“`java
public class OrderService {
public void processPayment(double amount) {
if (amount <= 0) {
// 标红:抛出自定义异常
throw new PaymentFailedException(“支付金额必须大于0,当前金额:” + amount);
}
// 其他处理逻辑…
}
}
“`

4. 异常处理与传递

通过`try-catch`捕获或声明抛出,注意异常包装技巧

“`java
try {
orderService.processPayment(-100);
} catch (PaymentFailedException e) {
// 重点:记录完整堆栈
logger.error(“支付失败: {}”, e.getMessage(), e);
// 转换为用户友好提示
throw new UserFriendlyException(“支付参数不合法,请检查金额”);
}
“`

5. 实战案例:电商库存校验

完整示例演示自定义异常的典型应用场景:

“`java
// 1. 定义库存不足异常
public class OutOfStockException extends Exception {
private String sku;

public OutOfStockException(String sku, int available) {
super(String.format(“SKU %s 库存不足,当前可用:%d”, sku, available));
this.sku = sku;
}

public String getSku() { return sku; }
}

// 2. 业务逻辑中使用
public class InventoryService {
private Map stock = new HashMap();

public void deductStock(String sku, int quantity) throws OutOfStockException {
int available = stock.getOrDefault(sku, 0);
if (available < quantity) {
throw new OutOfStockException(sku, available);
}
stock.put(sku, available – quantity);
}
}

// 3. 控制器层处理
@RestController
public class OrderController {
@PostMapping("/orders")
public ResponseEntity createOrder(@RequestBody Order order) {
try {
inventoryService.deductStock(order.getSku(), order.getQuantity());
return ResponseEntity.ok().build();
} catch (OutOfStockException e) {
// 重点:区分异常类型处理
return ResponseEntity.badRequest()
.body(new ErrorResponse(“STOCK_ERROR”, e.getMessage()));
}
}
}
“`

关键总结

1. 继承体系选择:根据业务需求决定继承`Exception`还是`RuntimeException`
2. 丰富上下文:在异常中包含业务数据(如SKU、金额等)
3. 异常处理分层:底层抛具体异常,上层做统一包装
4. 日志记录:始终记录完整的异常堆栈(`logger.error(message, e)`)
5. 用户提示:将技术异常转换为用户可理解的消息

通过这5个步骤,可以构建健壮的异常处理体系,显著提升系统可维护性。

(0)
上一篇 23小时前
下一篇 23小时前

相关推荐

  • 学记原文及翻译,哪里可以找到?

    您可以在多个渠道找到《学记》的原文及翻译,以下是一些建议: 一、权威网站与在线资源 古诗文网: 这是一个专注于古诗文学习和欣赏的网站,通常提供详细的原文、注释和翻译。您可以在该网站的搜索框中输入“《学记》”,即可找到相关的原文及翻译内容。 国学大师网: 这是一个集国学研究、资料整理与分享为一体的权威网站。您可以在该网站上搜索“《学记》”,找到详细的原文、注释…

    2025年1月2日
    990
  • 和愁有关的诗句,哪些能诉说你的心事?

    以下是一些与“愁”有关的诗句,它们或许能触动心弦,诉说某些心事: “问君能有几多愁?恰似一江春水向东流。” ——李煜《虞美人·春花秋月何时了》 这句诗以江水比喻愁绪,表达了愁之多、之绵长,如同江水般滔滔不绝,无法停歇。 “抽刀断水水更流,举杯消愁愁更愁。” ——李白《宣州谢朓楼饯别校书叔云》 诗人用抽刀断水、举杯消愁的比喻,表达了愁绪难以消除,反而越积越深的…

    2024年12月23日
    1280
  • 韩愈在哪些地方做过官

    韩愈在其政治生涯中,曾在多个地方担任官职,他的为官经历丰富且多样。以下是他主要任职的地方: 阳山县令:韩愈因论宫市之弊而被贬为阳山县令,这是他在地方上的第一次重要任职。阳山县位于今广东清远连州,当时是个交通不便、经济落后的地区。韩愈在阳山县令任上,尽管条件艰苦,但他仍然尽力履行职责,为当地百姓做了许多有益的事。 河南县令:在阳山县令之后,韩愈的仕途有所发展,…

    2024年9月15日
    1510
  • 带有“瑜”字的诗词,你有哪些推荐?

    以下是一些带有“瑜”字的诗词推荐: 魏晋时期 《读山海经》 作者:陶渊明 诗句:白玉凝素液,瑾瑜发奇光。 唐代 《醉送李协律赴湖南辟命,因寄沈八中丞》 作者:白居易 诗句:不羡君官羡君幕,幕中收得阮元瑜。 《陪诸公游故江西韦大夫通德湖旧居有感…韦大夫旧僚也》 作者:元稹 诗句:唯有满园桃李下,膺门偏拜阮元瑜。 《瑜不掩瑕》 作者:柴宿 诗句:朗玉微瑕在,分明…

    2024年12月10日
    3790
  • 桃红的诗句,你知道多少?感受桃红的娇艳与诗意

    关于“桃红”的诗句,自古以来便是文人墨客笔下常见的题材,它们不仅描绘了桃红的娇艳色彩,还寄托了诗人的情感与意境。以下是一些经典的含有“桃红”的诗句,让我们一起感受桃红的娇艳与诗意: “桃红又是一年春” 出处:谢枋得《庆全庵桃花》 赏析:这句诗以“桃红”作为春天的象征,表达了时间的流转与生命的循环。每当桃红再现,便意味着新的一年春天又来临了,充满了生机与希望。…

    2024年10月19日
    1380