예제1
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
atch (Exception ex) { string message = ex.InnerException?.Message ?? ex.Message; string exceptionXml = $@"<Ret> <StatusCode>101</StatusCode> <ErrorMessage>{System.Security.SecurityElement.Escape(message)}</ErrorMessage> <CONTENT></CONTENT> </Ret>"; XmlDocument errorDoc = new XmlDocument(); errorDoc.LoadXml(exceptionXml); return errorDoc.DocumentElement; } |
예제2
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
catch (Exception ex) { // 1. 메시지 구성 (Top + Inner) string message = ex.Message; if (ex.InnerException != null) { message += " | Inner: " + ex.InnerException.Message; } // 2. StackTrace 포함 (옵션) string stack = ex.StackTrace ?? ""; // 3. XML 안전 처리 string safeMessage = System.Security.SecurityElement.Escape(message); string safeStack = System.Security.SecurityElement.Escape(stack); // 4. XML 구성 string exceptionXml = $@"<Ret> <StatusCode>101</StatusCode> <ErrorMessage>{safeMessage}</ErrorMessage> <StackTrace>{safeStack}</StackTrace> <CONTENT></CONTENT> </Ret>"; XmlDocument errorDoc = new XmlDocument(); errorDoc.LoadXml(exceptionXml); return errorDoc.DocumentElement; } |
추가 중요 포인트 (실무 핵심)
1️⃣ XML 깨짐 방지 (매우 중요)
|
1 2 3 |
SecurityElement.Escape(message) |
👉 안 하면 이런 문제 발생:
<&포함 시 XML 파싱 에러- 실제 운영에서 꽤 자주 터짐
2️⃣ InnerException이 항상 더 중요한가?
👉 꼭 그렇지 않음
예:
ex.Message = "Top-level failure"InnerException.Message = "SQL timeout"
👉 상황에 따라 둘 다 필요할 수도 있음
🔥 실무용 (추천 로그 스타일)
|
1 2 3 4 5 6 7 8 |
string message = ex.Message; if (ex.InnerException != null) { message += " | Inner: " + ex.InnerException.Message; } |
✅ 결론
| 방식 | 안전성 | 추천 |
|---|---|---|
| ex.InnerException.Message | ❌ 위험 (null 가능) | ❌ |
| ex.Message | ⭕ 안전 | ⭕ |
| ex.InnerException?.Message ?? ex.Message | ⭕ 가장 안전 | ⭐ 추천 |