假設我們有一個類型的人的特定對象,並希望其Name屬性中存儲到本地變量,同時避免可能出現的異常應該對象爲空,我們可以這樣做:三元運算符的例外?其他選擇?
string personName = null;
if (person != null)
{
personName = person.Name;
}
但是,不必申報if語句範圍之外的變量並將其初始化爲默認值有點麻煩。相反,我們可以使用條件三元運算符寫這樣的:使用try-catch語句打交道時
string personName = person != null ? person.Name : null;
這同樣的問題也存在。假設我們正在嘗試查找TcpClient的遠程地址。我們可以做這樣的事情:
string remoteAddress = null;
try
{
remoteAddress = tcpClient.Client.RemoteEndPoint.ToString();
}
catch (SocketException e)
{
Console.WriteLine(e.Message);
return;
}
不過,據我所知,沒有用於簡化這樣的事情定義操作,我想有很好的理由,考慮到可能的複雜性。我想知道,是否有辦法讓這種事情更簡潔?也許一個涉及monads的解決方案會起作用,或者這個代碼應該保持原樣。
類似於TCP連接的情況代表了一種情況,通常適合於拋出可能被捕獲和處理的異常,因爲失敗的代碼可能在塊或方法內,並且處理異常的代碼在它之外。使用異常比「if(!TryReadOneByte(ref commandLength))break; if(!TryReadNBytes(commandLength,dat))break;等等。連接失敗應該中止當前的操作,但可能會非常合理地導致一次或多次重試(可能在不同的地址),然後冒泡到呼叫者。 – supercat