[python]shutil.rmtreeでエラー

Windows環境でshutil.rmtreeを使っていたらエラーが出た。

パスに日本語が混ざっていてかつ長い部分でエラーが出ていた。

エラーが出ていたのがos.removeの所だったので、これでもダメなのだろう。
仕方が無いので、代わりに

os.system("rmdir /s /q " + rdir)

でやったらうまくいった。

例外をシリアライズする方法

.NET Remotingで例外も通信してくれないかと調べていたら、例外をシリアル化・逆シリアル化できるようにすればいいことがわかった。

http://msdn.microsoft.com/ja-jp/library/dd296859.aspx

↑を超参考に例外を以下のように定義する。

    [Serializable()]
    public class MyException : ApplicationException
    {
        //普通に使うコンストラクタ
        public MyException() { }

        //逆シリアル化コンストラクタ
        public MyException(SerializationInfo info, StreamingContext context) :
            base(info, context) { }
    }

ポイントは、

  1. Serializable属性をつける。
  2. 逆シリアル化可能にするためのコンストラクタを定義する。
  3. 普通に例外を発生させるときのためのコンストラクタも定義する。

例外にデータを持たせたい時には、もうひと工夫必要だけど、上記のページを見れば書いてあるので省略。

何が起きたんだろう?

CruiseControl.NETを使っていたら、Subversionのチェックアウト時に失敗していた。
リポジトリを直接たたいたら、こんなメッセージを発した。

svnadmin: ファイルシステム '../db' に対して環境を開いているときに Berkeley DB エラーが起きました

svnadmin: Invalid argument

svnadmin: bdb: DB_REGISTER limits each process to a single open DB_ENV
handle

いろいろいじっているうちにdumpできるようになっていた(svnadmin recover のおかげ?)ので、dumpとloadを使って別リポジトリにコピーし、問題のリポジトリは破棄した。

DTDを読ませない方法

MSXMLでの話みたい。

IXMLDOMDocument.resolveExternals
IXMLDOMDocument.validateOnParse

のプロパティ2つをfalseにするといいみたい。


<!DOCTYPE ... SYSTEM....
の行をコメントアウトしたら読めた。でも、けずったらまずいぜ。という場合に有効。

参考:
http://gurizuri0505.halfmoon.jp/develop/delphi/msxml_dtd