Solidity
由另一個契約和例外創建的契約
我有兩個關於契約創建和例外的問題:
- 如果contract
A
創建了contractB
,然後throw
s在同一個函式里,B
也被刪除了?- 如果 contract在其建構子中
A
創建 contractB
和B
throw
s,異常是否會冒泡A
?
- 是的
B``B
如果包含創建的事務有異常,則不會創建。例子:pragma solidity ^0.4.8; contract A { B public b; function foo() { b = new B(); throw; } function getXfromB() returns (uint) { return b.x(); } } contract B { uint public x; function B() { x = 1; } }
使用browser-solidity 快速測試,先註釋掉
throw
. 然後“創建”A
,點擊foo
,然後點擊b
查看它的地址,點擊getXfromB
查看得到1。取消註釋throw
即可看到B
未創建:點擊b
查看為0x0。呼叫中的異常會導致所有更改(在該呼叫中)被還原,並且合約創建沒有什麼特別之處可以防止它被還原。有關更多資訊,請參閱拋出發生時整個事務是否恢復?
2.是的
Solidity 0.4已修復,因此如果
new B()
失敗,A
將獲得異常。通過“新”拋出失敗的契約創建
可以通過將
throw
infoo
移至 constructor來利用 #1 中的相同範例進行測試B()
。