如果發生某種情況,我必須停止當前方法調用的執行並返回到方法調用前的狀態.how我可以這樣做..假設ai正在執行一些樣本方法和條件發生,我正在提示一個消息框,然後我希望返回到此函數調用之前的狀態如何停止執行當前方法調用
回答
您可以使用Memento pattern來實現對象回滾。從here ...
看守打算做些什麼 的鼻祖,但想成爲 能夠撤消更改。管理員 首先要求發件人提供 紀念品對象。然後,它會執行任何要運行的操作(或操作序列) 。要回滾到操作前的狀態 ,它 將紀念物件返回到發件人 。
一旦您收到指示您應該回滾的事件,您可以撤消更改並返回給調用者。這裏有一些info. and links爲什麼你不應該使用Thread.Abort。
是否在調用方法之前可能已檢查錯誤條件?如果是這樣,拋出一個異常。
否則,return
有意義的東西(例如,如果它是void
函數,將其更改爲返回bool
,並返回false
)。
這是例外情況。您拋出異常終止函數和任何調用者,直到達到異常處理程序。
請注意,只有在出現異常情況時才應該這樣做;不應將異常用作「不同類型」的返回值,因爲它們在代碼大小(無論是否拋出)和運行時間(如果拋出)方面的成本更高,而不是正常返回值。
至於回到你前的狀態,這是可能的,如果您代碼和任何庫代碼,通過該電話進行寫在異常安全方式。
我猜你正在談論對象事務或事務內存的問題。
您至少可以做的是記錄被修改對象的狀態(賦值),並在賦值條件失敗時在其上寫入舊值。
如果我正確地理解了你,你想撤銷你對某些變量做出的改變,如果某些條件成立的話?如果是這樣的話,你會想要存儲所有變量的副本(或整個類)。然後,如果您的條件成立,您必須在從函數返回之前將所有這些變量恢復到其初始狀態。這將是這樣的:
// In order to clone your variable, you may need to inherit from
// ICloneable and implement the Clone function.
bool MyFunction(ICloneable c)
{
// 1. Create a copy of your variable
ICloneable clone = c.Clone();
// 2. Do whatever you want in here
...
// 3. Now check your condition
if (condition)
{
// Copy all the attributes back across to c from your clone
// (You'll have to write the ResetAttributes method yourself)
c.ResetAttributes(clone);
// Put a message box up
MessageBox.Show("This failed!");
// Now let the caller know that the function failed
return false;
}
else
{
// Let the caller know that the function succeeded
return true;
}
}
另一種解決方案,從上面那些略微不同:
檢查指定條件的位,然後現在在你的樣品的方法。
public void MyMethod()
{
some code
if (conditionOccurred == true){ reset to the previous state and exit;}
more code
}
這可能不符合本書的內容,但如果不經常使用它,它會給出相當簡單易讀的代碼。
我可能不需要提及,如果你想能夠返回它,你需要保存程序的狀態,並且你需要編寫一些代碼返回到這個狀態。
堆上的通用回滾功能對我來說是前所未聞的。但是你可以使用Command模式來獲得撤消功能,並用它來回滾:
http://en.wikipedia.org/wiki/Command_pattern
基本上你在存儲變化的足夠多的信息,它可以撤消它的對象封裝的操作。您將該對象推入堆棧,並且當您的條件發生時,您將彈出堆棧中的所有命令對象並將其撤銷。如果沒有關於您的案例的更多信息,則很難提供更具體的信息或判斷這是否適用於您。
- 1. 如何停止系統調用的當前執行的python
- 2. 如何停止方法的執行從運行()調用線程
- 3. 如何停止執行UserControls PageLoad方法?
- 4. 停止執行getCurrentPosition方法
- 5. 停止方法執行
- 6. 要求運行方法或停止當前方法
- 7. 如何停止Scilab中的當前執行?
- 8. 如何停止執行當前的PHP腳本?
- 9. 如何停止當前執行的線程
- 10. 如何在播放框架中停止當前執行
- 11. 如何終止當前類的執行?
- 12. Java方法停止調用
- 13. 如何在執行異步調用之前阻止執行?
- 14. REST方法 - 在執行其他方法之前執行「常用」方法調用
- 15. IOS:在其執行停止的方法
- 16. 5分鐘後停止方法執行
- 17. 停止方法從執行按鈕按
- 18. 如何使方法暫停執行,直到先前使用異步回調調用的方法完成
- 19. 如何停止執行eventlisteners
- 20. 如何停止Maven執行
- 21. 在調用另一個方法的方法中停止執行,然後繼續
- 22. 當方法停止執行時,Java嘗試更改JFrame標題
- 23. 如何停止當前的前臺進程並重新執行它?
- 24. 如何停止位置提取方法當我想要停止
- 25. 在當前正在執行的代碼行上停止調試器
- 26. 無法停止執行
- 27. 搖擺 - 從執行,直到前面的方法停止的方法是完全
- 28. 如何在用戶調用特定方法之前阻止當前線程?
- 29. 調用後停止執行代碼UIAlertView
- 30. PHP - 停止執行調用函數
執行的方法檢測到這種情況,還是在其他某個線程中檢測到它? – 2009-04-14 06:43:10
你是什麼意思「返回方法調用之前的狀態」?恢復所有的作業? – 2009-04-14 06:45:00