我嘗試將異常邏輯放在一個系統的一部分可以回退到意外行爲上。通過「拋出新的」來處理異常,最佳實踐是什麼?它已經被處理了
該工作應該由一個新類完成,該類繼承Exception
對象,並用一個新的「出口」擴展功能,該出口由用戶的錯誤信號和日誌記錄例程組成。
我可能需要了解使用throw
更好,但我以爲我可以使它相當通過即,該透明:
public SomeObject GetVersion(byte p)
{
switch ((SomeObject)p)
{
case Version.SomeType1:
...
break;
case Version.SomeType2:
...
break;
default:
throw new UnexpectedQueryException(this.someOtherObject, errorCode);
}
return (SomeObject)p;
}
我想你可以看到什麼,我想在這裏做。
我試圖拋出應用程序無法提供請求時。這個throw意味着通過異常執行執行(這會爲調用者生成足夠的錯誤代碼)。這個例子是一個類型爲「我知道你給了我一個9但是隻允許1-8的錯誤」的錯誤,「errorCode進一步發送給UnexpectedQueryException(...)
。
不幸的是,應用程序將throw作爲未處理並關閉了我的線程,並且應用程序在重新啓動之前不會運行。除了這種情況,我也使用這個拋出語句。
在我眼裏,這是非常處理。
這裏最好的做法是什麼?
我想異常處理是一個「回退」,以激活不同的情況下(如上),所以我總是有一個簡單的方法來傳達一個錯誤回到用戶(這意味着我可以發送非常確切的信息,例外)。
此外,我當然希望應用程序繼續工作。
從異常邏輯代碼的一部分,
public class UnexpectedQueryException: CommunicationException
{
public UnexpectedQueryException(SomeObject object, ErrorCode errorCode) : base("UnexpectedQueryException", object, errorCode)
{
.........
}
}
,反過來,繼承基礎異常對象,
public class CommunicationException : Exception
{
..some fields..
public CommunicationException(string Message, SomeObject object, ErrorCode errorcode)
{
.....
}
public CommunicationException() : base("CommunicationException")
{ }
}
您應該發佈調用'GetVersion'的代碼,然後處理異常。沒有任何跡象表明你已經處理了例外! –
@丹,謝謝。我認爲這個評論需要給我更好的解釋。拋出新的Unex..Exception()'時會發生什麼事情,如果不是將執行過程移入它呢? GetVersion在一個try/catch塊內部被調用,而這個塊又有一個'拋出新的Unexp ..()'在它的catch中。 – Independent