2017-05-18 27 views
-3

私のエラー処理がうまくいかない問題が発生しました。私は検索と掘り下げを使い果たしました。 基本的に、パスが存在するかどうかを確認しようとしていますが、file_locationが設定されていて、別のディレクトリに移動すると、ユーザーがフォルダを作成するためのアクセス権を持たない場合、ディレクトリが作成されます。Python例外の例外

すべてが動作しますが、エラーが発生してマイドキュメントを使用するとエラーが発生するため、例外が実行される可能性は100%わかりません。

try: 
    if os.path.exists(project_dir): 
     file_location = (project_dir) 
    else: 
     os.makedirs(project_dir) 
     file_location = (project_dir) 
except OSError as exc: 
    if exc.errno != errno.EEXIST: 
     raise 
    pass 
    os.makedirs(user_dir) 
    file_location = (user_dir) 
+1

使用している実際のインデントを反映するようにコードを投稿してください。 – patrick

+0

ようこそStackOverflowへ。ヘルプドキュメントの投稿ガイドラインを読み、それに従ってください。 [最小、完全で検証可能な例](http://stackoverflow.com/help/mcve)がここに適用されます。 MCVEコードを投稿して問題を正確に記述するまでは、効果的にお手伝いすることはできません。 投稿したコードをテキストファイルに貼り付け、説明した問題を再現できるはずです。 – Prune

+0

ありがとう、パトリック私のこの試みを吸い込ませようと試みたが、それを取り下げるだろう! –

答えて

0
は、プログラムがわかりやすくするために少し流れ、あなたのプログラムが重要な方法で失敗したときのための例外ハンドラを保存しようと変更し、ユーザーに警告するか、完全にプログラムの流れ(例外条件)を変更する必要がある

。システムが問題に遭遇したときの例外の一種として例外が存在するそれはを修正できません。

飛行機から飛び出さなければならない場合は、利用可能なパラシュートがないことがわかります。したがって、例外を処理しているときにパスが有効かどうかを確認するには、os.path.exists()を使用してください。最も安全なデフォルトは現在のディレクトリで、.をパスとして使用してアクセスできます。しかし、そうでない場合は、コードがクラッシュして焼く必要がある場合に備えて、ユーザーディレクトリがすでに存在していると仮定できるはずです。 mkdirの前に例外を処理する必要があります。

また、Pythonで正しくインデントするようにしてください。スペースはエラーを捕らえるのにも役立ちますので、コードを読みやすくするために改行を使用するのを恐れないでください。あなたのtry句は、余分なインデントレベルを必要とします。

try: 
    # simplify the if statement to stop repeating yourself 
    if not os.path.exists(project_dir): 
     os.makedirs(project_dir) 
    file_location = project_dir 

except OSError as exc: 
    if exc.errno != errno.EEXIST: 
     raise # reraise the current exception 

    if os.path.exists(user_dir): 
     file_location = user_dir 
    else: # FUBAR. Sound sirens immediately and try everything to keep the file somewhere in memory before failing. 
     print("[ERROR] {} was inaccessible.\nWhile attempting to recover, {} did not exist so files could not be backed up." 
      .format(project_dir, user_dir)) 
     raise 

例外ハンドラの故障が起こることを許可すべきではありません。それは大惨事な出来事なので、残っている唯一のオプションがデスクトップに残っていると予想する必要があります。 1つの例外が捕捉され、そこから回復することができます。 2つか3つの入れ子にされた例外は、あなたのコンピュータが感覚を得て、デジタルシャックルを倒そうとしていることを意味します(または、例外を扱う理由について懸命に考える必要がある)。

+0

ありがとうございました。 –