我有一個函數來從字典中彈出元素,如果出現任何錯誤,應拋出異常。代碼看起來相當不錯。W1035:函數'Take'的返回值可能未定義
type
ENoSuchElementException = class(Exception);
var
FResults: TDictionary<Cardinal, TObject> = TDictionary<Cardinal, TObject>.Create;
FLock: TCriticalSection = TCriticalSection.Create;
/// <exceptions cref="ENoSuchElementException">Element does not exist</exceptions>
function Take(Id: Cardinal): TObject;
begin
FLock.Acquire;
try
try
Result := FResults[Id]; // here may throw exception
FResults.Remove(Id);
except
on E: Exception do
begin
raise ENoSuchElementException.Create(E.ToString);
end;
end;
finally
FLock.Release;
end;
end;
但Delphi XE4編譯器抱怨W1035: Return value of function 'Take' might be undefined
。
我突然很困惑。如果拋出異常,爲什麼代碼仍然期望返回值?這是否意味着try...finally
會吃掉例外?有人可以指出我的代碼問題嗎?
已解決:正如David所說,try...except
應該移到外面。謝謝!
感嘆。我們不能有一個SSCCE嗎?現在我們每個人都必須花時間製作一個。 –
@David,我已經更新了代碼示例,現在它應該更加緊湊。 – stanleyxu2005
一個SSCCE真的是需要的 –