How to check if resouce was allocated correctly in a python ContextDecorator?
I have a class
class Resource:
__init__(self):
self.resource = ...
__enter__(self):
#can fail, such as file open returning error, memory allocation fail, or any more complicated failure
__exit__(self,*args):
...
Now I want
with Resource() as r:
r.do_stuff()
But if r
has failed to __enter__()
successfully, this fails.
What is the correct, pythonic way of handling this?
I didn't want to use some is_allocated_correctly
like so
with Resource() as r:
if r.is_allocated_correctly():
r.do_stuff()
as it breaks the point of the with statement.
Please give me some idea what to do here.
python python-3.x exception with-statement contextmanager
add a comment |
I have a class
class Resource:
__init__(self):
self.resource = ...
__enter__(self):
#can fail, such as file open returning error, memory allocation fail, or any more complicated failure
__exit__(self,*args):
...
Now I want
with Resource() as r:
r.do_stuff()
But if r
has failed to __enter__()
successfully, this fails.
What is the correct, pythonic way of handling this?
I didn't want to use some is_allocated_correctly
like so
with Resource() as r:
if r.is_allocated_correctly():
r.do_stuff()
as it breaks the point of the with statement.
Please give me some idea what to do here.
python python-3.x exception with-statement contextmanager
assuming the resource is allocated either in the__init__
or__enter__
AND an allocation failure would raise an exception (which is what should happen for any not-totally-broken lib allocating resources of any kind) AND you don't do anything stupid (like silently swallowing this exception) in yourResource
class, then you will NEVER enter thewith
block if the resource is not "correctly allocated". IOW, you have nothing special to do.
– bruno desthuilliers
Dec 27 at 13:53
add a comment |
I have a class
class Resource:
__init__(self):
self.resource = ...
__enter__(self):
#can fail, such as file open returning error, memory allocation fail, or any more complicated failure
__exit__(self,*args):
...
Now I want
with Resource() as r:
r.do_stuff()
But if r
has failed to __enter__()
successfully, this fails.
What is the correct, pythonic way of handling this?
I didn't want to use some is_allocated_correctly
like so
with Resource() as r:
if r.is_allocated_correctly():
r.do_stuff()
as it breaks the point of the with statement.
Please give me some idea what to do here.
python python-3.x exception with-statement contextmanager
I have a class
class Resource:
__init__(self):
self.resource = ...
__enter__(self):
#can fail, such as file open returning error, memory allocation fail, or any more complicated failure
__exit__(self,*args):
...
Now I want
with Resource() as r:
r.do_stuff()
But if r
has failed to __enter__()
successfully, this fails.
What is the correct, pythonic way of handling this?
I didn't want to use some is_allocated_correctly
like so
with Resource() as r:
if r.is_allocated_correctly():
r.do_stuff()
as it breaks the point of the with statement.
Please give me some idea what to do here.
python python-3.x exception with-statement contextmanager
python python-3.x exception with-statement contextmanager
asked Dec 27 at 13:32
Gulzar
7511520
7511520
assuming the resource is allocated either in the__init__
or__enter__
AND an allocation failure would raise an exception (which is what should happen for any not-totally-broken lib allocating resources of any kind) AND you don't do anything stupid (like silently swallowing this exception) in yourResource
class, then you will NEVER enter thewith
block if the resource is not "correctly allocated". IOW, you have nothing special to do.
– bruno desthuilliers
Dec 27 at 13:53
add a comment |
assuming the resource is allocated either in the__init__
or__enter__
AND an allocation failure would raise an exception (which is what should happen for any not-totally-broken lib allocating resources of any kind) AND you don't do anything stupid (like silently swallowing this exception) in yourResource
class, then you will NEVER enter thewith
block if the resource is not "correctly allocated". IOW, you have nothing special to do.
– bruno desthuilliers
Dec 27 at 13:53
assuming the resource is allocated either in the
__init__
or __enter__
AND an allocation failure would raise an exception (which is what should happen for any not-totally-broken lib allocating resources of any kind) AND you don't do anything stupid (like silently swallowing this exception) in your Resource
class, then you will NEVER enter the with
block if the resource is not "correctly allocated". IOW, you have nothing special to do.– bruno desthuilliers
Dec 27 at 13:53
assuming the resource is allocated either in the
__init__
or __enter__
AND an allocation failure would raise an exception (which is what should happen for any not-totally-broken lib allocating resources of any kind) AND you don't do anything stupid (like silently swallowing this exception) in your Resource
class, then you will NEVER enter the with
block if the resource is not "correctly allocated". IOW, you have nothing special to do.– bruno desthuilliers
Dec 27 at 13:53
add a comment |
1 Answer
1
active
oldest
votes
The purpose of the with
statement is correctly de-allocate resources or reset state after the block has finished.
If you can't enter the context block without an error, that needs handling outside of the with statement.
Surround the whole thing with a try/except
:
try:
with Resource() as r:
r.do_stuff()
except ResourceException as error:
handle_error(error)
Or if there's nothing you can do about the error, just let it pass:
with Resource() as r:
r.do_stuff()
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53945943%2fhow-to-check-if-resouce-was-allocated-correctly-in-a-python-contextdecorator%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
The purpose of the with
statement is correctly de-allocate resources or reset state after the block has finished.
If you can't enter the context block without an error, that needs handling outside of the with statement.
Surround the whole thing with a try/except
:
try:
with Resource() as r:
r.do_stuff()
except ResourceException as error:
handle_error(error)
Or if there's nothing you can do about the error, just let it pass:
with Resource() as r:
r.do_stuff()
add a comment |
The purpose of the with
statement is correctly de-allocate resources or reset state after the block has finished.
If you can't enter the context block without an error, that needs handling outside of the with statement.
Surround the whole thing with a try/except
:
try:
with Resource() as r:
r.do_stuff()
except ResourceException as error:
handle_error(error)
Or if there's nothing you can do about the error, just let it pass:
with Resource() as r:
r.do_stuff()
add a comment |
The purpose of the with
statement is correctly de-allocate resources or reset state after the block has finished.
If you can't enter the context block without an error, that needs handling outside of the with statement.
Surround the whole thing with a try/except
:
try:
with Resource() as r:
r.do_stuff()
except ResourceException as error:
handle_error(error)
Or if there's nothing you can do about the error, just let it pass:
with Resource() as r:
r.do_stuff()
The purpose of the with
statement is correctly de-allocate resources or reset state after the block has finished.
If you can't enter the context block without an error, that needs handling outside of the with statement.
Surround the whole thing with a try/except
:
try:
with Resource() as r:
r.do_stuff()
except ResourceException as error:
handle_error(error)
Or if there's nothing you can do about the error, just let it pass:
with Resource() as r:
r.do_stuff()
answered Dec 27 at 13:41
Peter Wood
16.2k33268
16.2k33268
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53945943%2fhow-to-check-if-resouce-was-allocated-correctly-in-a-python-contextdecorator%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
assuming the resource is allocated either in the
__init__
or__enter__
AND an allocation failure would raise an exception (which is what should happen for any not-totally-broken lib allocating resources of any kind) AND you don't do anything stupid (like silently swallowing this exception) in yourResource
class, then you will NEVER enter thewith
block if the resource is not "correctly allocated". IOW, you have nothing special to do.– bruno desthuilliers
Dec 27 at 13:53