[英]Counting the number of exceptions happening in catch block
我試圖收集所有異常發生的計數和ConcurrentHashMap
的異常名稱,以便我應該知道發生了多少次此異常。
因此,在我的catch塊中,我有一個映射,它將繼續添加異常名稱並且總計數發生。
下面是我的代碼which I have modified to always throw SQL Exception
每次都為測試目的which I have modified to always throw SQL Exception
,以便我可以看到異常的計數是否准確。
所以某些情況 -
1)如果我選擇線程數為10
,任務數為50
,那么在該映射中,我可以看到該特定字符串的500個異常
2)但是如果我選擇的線程數為40
,任務數為500
那么我在該地圖19000
不到20000
異常,它顯示在19000
左右。
我的問題是為什么? 我在這做什么錯?
class Task implements Runnable {
public static final AtomicInteger counter_exception = new AtomicInteger(0);
public static ConcurrentHashMap<String, Integer> exceptionMap = new ConcurrentHashMap<String, Integer>();
@Override
public void run() {
try {
//Making a db connection and then executing the SQL-
} catch (SQLException e) {
exceptionMap.put(e.getCause().toString(), counter_exception.incrementAndGet());
} catch (Exception e) {
}
}
}
更新:
如果我有這樣的東西 - 我得到40個線程和4000 taks的Null Pointer Exception
。 為什么?
catch (SQLException e) {
synchronized(this) {
exceptionMap.put(e.getCause().toString(), counter_exception.incrementAndGet());
}
}
也許這樣的事情正在發生:
任務1-500:捕獲異常,准備調用exceptionMap.put
,從counter_exception.incrementAndGet()
獲取一個傳遞給所述方法的數字
任務500:原子整數計數器中的數字500已被調度,因此其exceptionMap.put
首先運行
任務1:原子整數計數器中的數字1已被調度,因此其exceptionMap.put
最后運行
現在即使計數器是500並且我們有500個例外,異常消息也會與1相關聯,因為它是最近執行的。
這讓我覺得這是錯誤的做法。
如果您在加載的應用程序中遇到異常,您應該找到這些異常的原因(或原因)並修復它們。
計算異常並沒有幫助。 事實上,您可能會通過以下方式使問題變得更糟:
好的,那么你能做些什么來讓問題更容易找到?
Exception
或RuntimeException
或Throwable
。 如果在應用程序處於負載狀態時出現異常(特別是奇怪的異常),則可能存在由兩個或多個線程共享且未正確同步的數據結構/對象/變量。 我建議您對代碼庫進行代碼審查,以查找此類問題。
UPDATE
查看更新的代碼,NPE最可能的原因是e.getCause()
返回null
; 即你的一些例外沒有鏈式“原因”異常! 處理這應該是微不足道的; 即測試e.getCause()
返回的值。
請注意,由於您使用的是ConcurrentHashMap
,因此不能將null
用作鍵。 這是明確禁止的 - 請參閱javadoc。
另一個可能的原因是錯誤同步。
synchronized(this) {
exceptionMap.put(e.getCause().toString(),
counter_exception.incrementAndGet());
}
問題是,你正在同步上this
,並執行相同的代碼其他線程都會有不同的this
......這樣你就不會跟他們同步。
但是,我很確定你實際上不需要與其他線程同步,因為:
我會將exceptionMap
聲明為final
,並刪除synchronized
塊。
如果確實需要同步,則應該同步這兩個靜態對象之一,或者可能在Task.class
上Task.class
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.