ΠΡΠΈΠΌΠ΅Ρ 9.2. ΠΠ΅Π·ΠΎΠΏΠ°ΡΠ½ΡΠΉ ΠΏΡΠΈ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ
#include <iostream>
#include <stdexcept>
using namespace std;
class Device {
public:
Device(int devno) {
if (devno == 2)
throw runtime_error("Big problem");
}
~Device() {}
};
class Broker {
public:
Broker (int devno1, int devno2) : dev1_(NULL), dev2_(NULL) {
try {
dev1_ = new Device(devno1); // ΠΠ°ΠΊΠ»ΡΡΠΈΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΡ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ
dev2_ = new Device(devno2); // ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² Π² Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ Π²
// Π±Π»ΠΎΠΊ try ...
} catch (...) {
delete dev1_; // ...ΠΎΡΠΈΡΡΠΈΡΡ ΠΏΠ°ΠΌΡΡΡ ΠΈ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ
throw; // Π²ΡΠ±ΡΠΎΡΠΈΡΡ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅, Π΅ΡΠ»ΠΈ ΡΡΠΎ-ΡΠΎ Π½Π΅
// ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΎΡΡ.
}
}
~Broker() {
delete dev1_;
delete dev2_;
}
private:
Broker();
Device* dev1_;
Device* dev2_;
};
int main() {
try {
Broker b(1, 2);
} catch(exception& e) {
cerr << "Exception: " << e.what() << endl;
}
}
ΠΠ±ΡΡΠΆΠ΄Π΅Π½ΠΈΠ΅Π‘ΠΊΠ°Π·Π°ΡΡ, ΡΡΠΎ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ, ΡΡΠ½ΠΊΡΠΈΡ-ΡΠ»Π΅Π½, Π΄Π΅ΡΡΡΡΠΊΡΠΎΡ ΠΈΠ»ΠΈ ΡΡΠΎ-Π½ΠΈΠ±ΡΠ΄Ρ Π΄ΡΡΠ³ΠΎΠ΅ Β«Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎ ΠΏΡΠΈ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡΡ Β», β Π·Π½Π°ΡΠΈΡ Π³Π°ΡΠ°Π½ΡΠΈΡΠΎΠ²Π°ΡΡ, ΡΡΠΎ ΠΏΡΠΈ ΠΈΡ ΡΠ°Π±ΠΎΡΠ΅ Π½Π΅ Π±ΡΠ΄Π΅Ρ ΡΡΠ΅ΡΠΊΠΈ ΡΠ΅ΡΡΡΡΠΎΠ² ΠΈ, Π²Π΅ΡΠΎΡΡΠ½ΠΎ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠ΅ ΠΈΠΌΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΡ Π½Π΅ Π±ΡΠ΄ΡΡ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡΡ Π² ΠΏΡΠΎΡΠΈΠ²ΠΎΡΠ΅ΡΠΈΠ²ΠΎΠΌ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ. Π ΡΠ·ΡΠΊΠ΅ C++ ΡΠ°ΠΊΠΎΠ³ΠΎ ΡΠΎΠ΄Π° Π³Π°ΡΠ°Π½ΡΠΈΠΈ Π½Π°Π·Π²Π°Π½Ρ Π±Π°Π·ΠΎΠ²ΡΠΌΠΈ ΠΈ ΡΡΡΠΎΠ³ΠΈΠΌΠΈ.
ΠΠ°Π·ΠΎΠ²Π°Ρ Π³Π°ΡΠ°Π½ΡΠΈΡ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ ΠΏΡΠΈ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡΡ , ΠΊΠΎΡΠΎΡΠ°Ρ ΠΈΠ½ΡΡΠΈΡΠΈΠ²Π½ΠΎ Π²ΠΏΠΎΠ»Π½Π΅ ΠΏΠΎΠ½ΡΡΠ½Π°, ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ ΠΏΡΠΈ Π²ΡΠ±ΡΠ°ΡΡΠ²Π°Π½ΠΈΠΈ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠ΅ΠΊΡΡΠ°Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ Π½Π΅ ΠΏΡΠΈΠ²Π΅Π΄Π΅Ρ ΠΊ ΡΡΠ΅ΡΠΊΠ΅ ΡΠ΅ΡΡΡΡΠΎΠ² ΠΈ Π²ΠΎΠ²Π»Π΅ΡΠ΅Π½Π½ΡΠΉ Π² ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΏΠΎ-ΠΏΡΠ΅ΠΆΠ½Π΅ΠΌΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ (Ρ.Π΅. Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π²ΡΠ·Π²Π°ΡΡ Π΄ΡΡΠ³ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ-ΡΠ»Π΅Π½Ρ ΠΈ ΡΠ½ΠΈΡΡΠΎΠΆΠΈΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ Π΅Π³ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎ). ΠΡΠΎ ΡΠ°ΠΊΠΆΠ΅ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ Π² ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½Π½ΠΎΠΌ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ, Ρ ΠΎΡΡ ΠΎΠ½ΠΎ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π½Π΅ΠΏΡΠ΅Π΄ΡΠΊΠ°Π·ΡΠ΅ΠΌΡΠΌ. ΠΡΠ°Π²ΠΈΠ»Π° ΠΏΡΠΎΡΡΡΠ΅: Π΅ΡΠ»ΠΈ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π²ΡΠ±ΡΠ°ΡΡΠ²Π°Π΅ΡΡΡ Π³Π΄Π΅-Π½ΠΈΠ±ΡΠ΄Ρ Π² ΡΠ΅Π»Π΅ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ) ΡΡΠ½ΠΊΡΠΈΠΈ-ΡΠ»Π΅Π½Π°, ΡΠΎΠ·Π΄Π°Π½Π½ΡΠ΅ Π² Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΡ Π½Π΅ Π»ΠΈΡΠ°ΡΡΡΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ, Π° Π²ΠΎΠ²Π»Π΅ΡΠ΅Π½Π½ΡΠ΅ Π² ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΡ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΡΠ½ΠΈΡΡΠΎΠΆΠ΅Π½Ρ ΠΈΠ»ΠΈ Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Ρ Π² Π²ΡΠ·ΡΠ²Π°ΡΡΠ΅ΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅. ΠΡΡΠ³Π°Ρ Π³Π°ΡΠ°Π½ΡΠΈΡ, Π½Π°Π·Π²Π°Π½Π½Π°Ρ ΡΡΡΠΎΠ³ΠΎΠΉ Π³Π°ΡΠ°Π½ΡΠΈΠ΅ΠΉ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ, ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½ΠΎΡΡΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ°, Π΅ΡΠ»ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ Π·Π°Π²Π΅ΡΡΠ°Π΅ΡΡΡ Π½Π΅ΡΠ΄Π°ΡΠ½ΠΎ. ΠΠΎΡΠ»Π΅Π΄Π½Π΅Π΅ ΠΎΡΠ½ΠΎΡΠΈΡΡΡ ΠΊ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡΠΌ, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ»Π΅Π΄ΡΡΡ ΠΏΠΎΡΠ»Π΅ ΠΊΠΎΠ½ΡΡΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ°, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΏΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡ, ΠΊΠΎΡΠΎΡΡΠΉ Π²ΡΠ±ΡΠ°ΡΡΠ²Π°Π΅Ρ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅, Π²ΡΠ΅Π³Π΄Π° Π±ΡΠ΄Π΅Ρ ΡΠΊΠΎΠ½ΡΡΡΡΠΈΡΠΎΠ²Π°Π½ Π½Π΅ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΠΈ ΠΏΠΎΡΡΠΎΠΌΡ Π²ΡΠ΅Π³Π΄Π° Π±ΡΠ΄Π΅Ρ ΠΈΠΌΠ΅ΡΡ Π½Π΅Π΄ΠΎΡΡΠΎΠ²Π΅ΡΠ½ΠΎΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅. Π― Π²Π΅ΡΠ½ΡΡΡ ΠΊ ΡΡΠ½ΠΊΡΠΈΡΠΌ-ΡΠ»Π΅Π½Π°ΠΌ Π² ΡΠ΅ΡΠ΅ΠΏΡΠ΅ 9.4. Π’Π΅ΠΏΠ΅ΡΡ ΠΆΠ΅ Π΄Π°Π²Π°ΠΉΡΠ΅ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΡΠ΄Π΅Π»ΠΈΠΌ ΠΊΠΎΠ½ΡΡΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ².
Π ΠΏΡΠΈΠΌΠ΅ΡΠ΅ 9.2 ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΡΡΡ Π΄Π²Π° ΠΊΠ»Π°ΡΡΠ°, Device ΠΈ Broker, ΠΊΠΎΡΠΎΡΡΠ΅ Π΄Π΅Π»Π°ΡΡ Π½Π΅ ΠΎΡΠ΅Π½Ρ ΠΌΠ½ΠΎΠ³ΠΎ, Π½ΠΎ Ρ ΠΈΡ ΠΏΠΎΠΌΠΎΡΡΡ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ Π±Ρ Π»Π΅Π³ΠΊΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΡΡ Π»ΡΠ±ΠΎΠΉ ΡΡΠ΅Π½Π°ΡΠΈΠΉ ΡΠ°Π±ΠΎΡΡ ΠΏΠ°ΡΡ ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎ/Π±ΡΠΎΠΊΠ΅Ρ, ΠΊΠΎΠ³Π΄Π° Π²Ρ ΠΈΠΌΠ΅Π΅ΡΠ΅ Π½Π΅ΠΊΠΎΡΠΎΡΡΠΉ ΠΊΠ»Π°ΡΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΡΠΊΡΡΠ²Π°Π΅Ρ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡ ΠΈΠ· Π΄Π²ΡΡ ΡΡΡΡΠΎΠΉΡΡΠ² ΠΈ ΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ ΡΠ²ΡΠ·ΡΡ ΠΌΠ΅ΠΆΠ΄Ρ Π½ΠΈΠΌΠΈ. ΠΡΠΎΠΊΠ΅Ρ Π±Π΅ΡΠΏΠΎΠ»Π΅Π·Π΅Π½, Π΅ΡΠ»ΠΈ Π΄ΠΎΡΡΡΠΏΠ½ΠΎ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄Π½ΠΎ ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎ, ΠΏΠΎΡΡΠΎΠΌΡ ΡΠ΅ΠΌΠ°Π½ΡΠΈΠΊΠ° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ ΠΏΡΠΈ Π½Π°Π»ΠΈΡΠΈΠΈ Π±ΡΠΎΠΊΠ΅ΡΠ° Π΄ΠΎΠ»ΠΆΠ½Π° ΡΡΠΈΡΡΠ²Π°ΡΡ, ΡΡΠΎ ΠΏΡΠΈ Π²ΡΠ±ΡΠ°ΡΡΠ²Π°Π½ΠΈΠΈ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· Π΄Π²ΡΡ ΡΡΠΈΡ ΡΡΡΡΠΎΠΉΡΡΠ², ΠΊΠΎΠ³Π΄Π° Π΄Π΅Π»Π°Π΅ΡΡΡ ΠΏΠΎΠΏΡΡΠΊΠ° ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ Π½Π΅ΠΌΡ, Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°ΡΡΡΡ Π΄ΡΡΠ³ΠΎΠ΅ ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎ. ΠΡΠΎ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΡΡΠ΅ΡΠΊΠΈ ΠΏΠ°ΠΌΡΡΠΈ ΠΈ Π΄ΡΡΠ³ΠΈΡ ΡΠ΅ΡΡΡΡΠΎΠ².
ΠΠ»ΠΎΠΊΠΈ try ΠΈ catch ΡΠ΄Π΅Π»Π°ΡΡ ΡΡΡ ΡΠ°Π±ΠΎΡΡ. Π ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ΅ Π·Π°ΠΊΠ»ΡΡΠΈΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΡ ΠΏΠΎ Π²ΡΠ΄Π΅Π»Π΅Π½ΠΈΡ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ Π΄Π»Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Π² Π±Π»ΠΎΠΊ try ΠΈ ΠΏΠ΅ΡΠ΅Ρ Π²Π°ΡΡΠ²Π°ΠΉΡΠ΅ Π²ΡΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠ΅ Π²ΡΠ±ΡΠ°ΡΡΠ²Π°ΡΡΡΡ Π² Ρ ΠΎΠ΄Π΅ ΠΊΠΎΠ½ΡΡΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΡΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ°.
try {
dev1_ = new Device(devno1);
dev2_ = new Device(devno2);
} catch (...) {
delete dev1_;
throw;
}
ΠΠ½ΠΎΠ³ΠΎΡΠΎΡΠΈΠ΅ Π² ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ΅ catch ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ Π»ΡΠ±ΠΎΠ΅ Π²ΡΠ±ΡΠΎΡΠ΅Π½Π½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π±ΡΠ΄Π΅Ρ ΠΏΠ΅ΡΠ΅Ρ Π²Π°ΡΠ΅Π½ΠΎ. Π Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π²Π°ΠΌ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΏΠΎΡΡΡΠΏΠ°ΡΡ ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΠ°ΠΊ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π²Ρ Π»ΠΈΡΡ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π΅ΡΠ΅ ΠΏΠ°ΠΌΡΡΡ, Π΅ΡΠ»ΠΈ ΡΡΠΎ-ΡΠΎ Π½Π΅ ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΎΡΡ, ΠΈ Π·Π°ΡΠ΅ΠΌ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ Π²ΡΠ±ΡΠ°ΡΡΠ²Π°Π΅ΡΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΠΎΡ Π΅Π³ΠΎ ΡΠΈΠΏΠ°. ΠΠ°ΠΌ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ Π²ΡΠ±ΡΠΎΡΠΈΡΡ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅, ΡΡΠΎΠ±Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠ°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΡΡΠ°Π΅ΡΡΡ ΠΈΠ½ΡΡΠ°Π½ΡΠΈΡΠΎΠ²Π°ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ Broker, ΠΌΠΎΠ³Π»Π° ΡΠ΄Π΅Π»Π°ΡΡ ΡΡΠΎ-ΡΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠ΅ Ρ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ΠΌ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Π·Π°ΠΏΠΈΡΠ°ΡΡ ΠΊΡΠ΄Π°-Π½ΠΈΠ±ΡΠ΄Ρ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅Π΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ΅.
Π catch-ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ΅ Ρ ΡΠ΄Π°Π»ΡΡ Π»ΠΈΡΡ dev1_, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅Π΅ Π²ΡΠ±ΡΠ°ΡΡΠ²Π°Π½ΠΈΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ»ΡΠΊΠΎ Π² ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ΅ new Π΄Π»Ρ dev2_. ΠΡΠ»ΠΈ ΠΎΠ½ Π²ΡΠ±ΡΠ°ΡΡΠ²Π°Π΅Ρ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅, ΡΠΎ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ dev2_ Π½Π΅ Π±ΡΠ΄Π΅Ρ ΠΏΡΠΈΡΠ²ΠΎΠ΅Π½ΠΎ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΈ, ΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ, ΠΌΠ½Π΅ Π½Π΅ Π½ΡΠΆΠ½ΠΎ ΡΠ΄Π°Π»ΡΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ dev2_. ΠΠ΄Π½Π°ΠΊΠΎ, Π΅ΡΠ»ΠΈ Π²Ρ ΡΡΠΎ-ΡΠΎ Π΄Π΅Π»Π°Π΅ΡΠ΅ ΠΏΠΎΡΠ»Π΅ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ dev2_, Π²Π°ΠΌ ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΡΡΡ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ Π·Π°ΡΠΈΡΡΠΊΡ ΡΡΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ°. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ:
try {
dev1_ = new Device(devno1);
dev2_ = new Device(devno2);
foo_ = new MyClass(); // ΠΠΎΠΆΠ΅Ρ Π²ΡΠ±ΡΠΎΡΠΈΡΡ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
} catch (...) {
delete dev1_;
delete dev2_;
throw;
}
Π ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π²Π°ΠΌ Π½Π΅ ΡΠ»Π΅Π΄ΡΠ΅Ρ Π±Π΅ΡΠΏΠΎΠΊΠΎΠΈΡΡΡΡ ΠΎΠ± ΡΠ΄Π°Π»Π΅Π½ΠΈΠΈ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΉ, ΠΊΠΎΡΠΎΡΡΠΌ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π»ΠΈΡΡ ΡΠ΅Π°Π»ΡΠ½ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ (Π΅ΡΠ»ΠΈ ΠΈΠ·Π½Π°ΡΠ°Π»ΡΠ½ΠΎ Π²Ρ Π½Π΅ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π»ΠΈ ΠΈΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ), ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ NULL Π½Π΅ Π΄Π°Π΅Ρ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ ΡΡΡΠ΅ΠΊΡΠ°. ΠΡΡΠ³ΠΈΠΌΠΈ ΡΠ»ΠΎΠ²Π°ΠΌΠΈ, Π΅ΡΠ»ΠΈ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ dev1_ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡ ΠΊ Π²ΡΠ±ΡΠ°ΡΡΠ²Π°Π½ΠΈΡ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ, Π²Π°Ρ catch-ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ Π²ΡΠ΅ ΠΆΠ΅ Π²ΡΠΏΠΎΠ»Π½ΠΈΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ delete dev2_, ΠΎΠ΄Π½Π°ΠΊΠΎ Π²ΡΠ΅ Π±ΡΠ΄Π΅Ρ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎ, Π΅ΡΠ»ΠΈ Π²Ρ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π»ΠΈ Π΅Π³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ NULL Π² ΡΠΏΠΈΡΠΊΠ΅ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ.
ΠΠ°ΠΊ Ρ Π³ΠΎΠ²ΠΎΡΠΈΠ» Π² ΡΠ΅ΡΠ΅ΠΏΡΠ΅ 9.1, ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Ρ ΠΎΡΠ½ΠΎΠ²Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ, Π΄Π»Ρ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΡ Π³ΠΈΠ±ΠΊΠΎΠΉ ΡΡΡΠ°ΡΠ΅Π³ΠΈΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΡΡΠ΅Π±ΠΎΠ²Π°ΡΡΡΡ ΠΎΡΠΎΠ±Π°Ρ Π»ΠΎΠ²ΠΊΠΎΡΡΡ, ΠΈ ΡΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅ ΠΎΡΠ½ΠΎΡΠΈΡΡΡ ΠΊ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΡ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ. ΠΠΎΠ΄ΡΠΎΠ±Π½ΠΎΠ΅ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π½ΠΈΠ΅ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°, Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠΈ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡΡ , ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡΡΡ Π² ΠΊΠ½ΠΈΠ³Π΅ Β«Exceptional Π‘++Β», Π½Π°ΠΏΠΈΡΠ°Π½Π½ΠΎΠΉ ΠΠ΅ΡΠ±ΠΎΠΌ Π‘Π°ΡΡΠ΅ΡΠΎΠΌ (Herb Sutter) (ΠΈΠ·Π΄Π°ΡΠ΅Π»ΡΡΡΠ²ΠΎ Β«Addison WesleyΒ»).
Π‘ΠΌΠΎΡΡΠΈ ΡΠ°ΠΊΠΆΠ΅Π Π΅ΡΠ΅ΠΏΡ 9.3.
9.3. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠΈ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡΡ ΡΠΏΠΈΡΠΊΠ° ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ
ΠΠ΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ Π²Π°ΡΠΈ Π΄Π°Π½Π½ΡΠ΅-ΡΠ»Π΅Π½Ρ Π² ΡΠΏΠΈΡΠΊΠ΅ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ°, ΠΈ ΠΏΠΎΡΡΠΎΠΌΡ Π²Ρ Π½Π΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΎΠΌ, ΠΎΠΏΠΈΡΠ°Π½Π½ΡΠΌ Π² ΡΠ΅ΡΠ΅ΠΏΡΠ΅ 9.2.
Π Π΅ΡΠ΅Π½ΠΈΠ΅ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠΉ ΡΠΎΡΠΌΠ°Ρ Π±Π»ΠΎΠΊΠΎΠ² try ΠΈ catch, ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Π½ΡΠΉ Π΄Π»Ρ ΠΏΠ΅ΡΠ΅Ρ Π²Π°ΡΠ° ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ, Π²ΡΠ±ΡΠ°ΡΡΠ²Π°Π΅ΠΌΡΡ Π² ΡΠΏΠΈΡΠΊΠ΅ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ. ΠΡΠΈΠΌΠ΅Ρ 9.3 ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ, ΠΊΠ°ΠΊ ΡΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ.
ΠΡΠΈΠΌΠ΅Ρ 9.3. ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ Π² ΡΠΏΠΈΡΠΊΠ΅ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ
#include <iostream>
#include <stdexcept>
using namespace std;
// ΠΠ΅ΠΊΠΎΡΠΎΡΠΎΠ΅ ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎ
class Device {
public:
Device(int devno) {
if (devno == 2)
throw runtime error("Big problem");
}
~Device() {}
private:
Device();
};
class Broker {
public:
Broker (int devno1, int devno2)
try : dev1_(Device(devno1)), // Π‘ΠΎΠ·Π΄Π°ΡΡ ΡΡΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΡ Π² ΡΠΏΠΈΡΠΊΠ΅
dev2_(Device(devno2)) {} // ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ
catch (...) {
throw; // ΠΡΠ΄Π°ΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π² ΠΆΡΡΠ½Π°Π» ΡΠΎΠ±ΡΡΠΈΠΉ ΠΈΠ»ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΠΎΡΠΈΠ±ΠΊΡ
// Π²ΡΠ·ΡΠ²Π°ΡΡΠ΅ΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ (ΡΠΌ. Π½ΠΈΠΆΠ΅ ΠΎΠ±ΡΡΠΆΠ΄Π΅Π½ΠΈΠ΅)
}
~Broker() {}
private:
Broker();
Device dev1_;
Device dev2_;
};
int main() {
try {
Broker b(1, 2);
} catch(exception& e) {
cerr << "Exception: " << e.what() << endl;
}
}
ΠΠ±ΡΡΠΆΠ΄Π΅Π½ΠΈΠ΅Π‘ΠΈΠ½ΡΠ°ΠΊΡΠΈΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ Π² ΡΠΏΠΈΡΠΊΠ°Ρ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΡΠ»ΠΈΡΠ°Π΅ΡΡΡ ΠΎΡ ΡΡΠ°Π΄ΠΈΡΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ° Π‘++, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Π·Π΄Π΅ΡΡ Π±Π»ΠΎΠΊ try ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΡΠ΅Π»Π° ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ°. ΠΡΠΈΡΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΠ°ΡΡΡΡ ΠΏΡΠΈΠΌΠ΅ΡΠ° 9.3 ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ ΠΊΠ»Π°ΡΡΠ° Broker.
Broker(int devno1, int devno2) // ΠΠ°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ° ΡΠ°ΠΊΠΎΠΉ ΠΆΠ΅ Constructor
try : // ΠΠ΅ΠΉΡΡΠ²ΡΠ΅Ρ ΡΠ°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ try {...}
dev1_(Device(devno1)), // ΠΠ°ΡΠ΅ΠΌ ΠΈΠ΄ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΡ ΡΠΏΠΈΡΠΊΠ°
dev2_(Device(devno2)) { // ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ
// ΠΠ΄Π΅ΡΡ Π·Π°Π΄Π°ΡΡΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΡ ΡΠ΅Π»Π° ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ°.
} catch (...) { // catch ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ Π·Π°Π΄Π°Π΅ΡΡΡ *ΠΏΠΎΡΠ»Π΅*
throw; // ΡΠ΅Π»Π° ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ°
}
Π Π΅ΠΆΠΈΠΌ ΡΠ°Π±ΠΎΡΡ Π±Π»ΠΎΠΊΠΎΠ² try ΠΈ catch Π²ΠΏΠΎΠ»Π½Π΅ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌ; Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΠΎΠ΅ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΠΎΡ ΠΎΠ±ΡΡΠ½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ° try Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ ΠΏΡΠΈ ΠΏΠ΅ΡΠ΅Ρ Π²Π°ΡΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ, Π²ΡΠ±ΡΠΎΡΠ΅Π½Π½ΡΡ ΠΈΠ· ΡΠΏΠΈΡΠΊΠ° ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ, Π·Π° ΠΊΠ»ΡΡΠ΅Π²ΡΠΌ ΡΠ»ΠΎΠ²ΠΎΠΌ try ΠΈΠ΄Π΅Ρ Π΄Π²ΠΎΠ΅ΡΠΎΡΠΈΠ΅, Π·Π°ΡΠ΅ΠΌ ΡΠΏΠΈΡΠΎΠΊ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΈ ΠΏΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎ Π±Π»ΠΎΠΊ try, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΠΈ ΡΠ΅Π»ΠΎΠΌ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ°. ΠΡΠ»ΠΈ ΠΊΠ°ΠΊΠΎΠ΅-Π½ΠΈΠ±ΡΠ΄Ρ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π²ΡΠ±ΡΠ°ΡΡΠ²Π°Π΅ΡΡΡ ΠΈΠ· ΡΠΏΠΈΡΠΊΠ° ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΈΠ»ΠΈ ΠΈΠ· ΡΠ΅Π»Π° ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ°, ΠΎΠ½ΠΎ Π±ΡΠ΄Π΅Ρ ΠΏΠ΅ΡΠ΅Ρ Π²Π°ΡΠ΅Π½ΠΎ catch-ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠΌ, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ ΠΏΠΎΡΠ»Π΅ ΡΠ΅Π»Π° ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ°. ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΡΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π² ΡΠ΅Π»ΠΎ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ° Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ ΠΏΠ°ΡΡ Π±Π»ΠΎΠΊΠΎΠ² try/catch, ΠΎΠ΄Π½Π°ΠΊΠΎ Π²Π»ΠΎΠΆΠ΅Π½Π½ΡΠ΅ Π±Π»ΠΎΠΊΠΈ try/catch ΠΎΠ±ΡΡΠ½ΠΎ Π²ΡΠ³Π»ΡΠ΄ΡΡ Π½Π΅ΠΏΡΠΈΠ²Π»Π΅ΠΊΠ°ΡΠ΅Π»ΡΠ½ΠΎ.