[{"data":1,"prerenderedAt":2448},["ShallowReactive",2],{"navigation":3,"\u002Foperate\u002Fconcepts\u002Ferror-handling":750,"\u002Foperate\u002Fconcepts\u002Ferror-handling-surround":2443},[4,80,134,364,428,530,567,646],{"title":5,"path":6,"stem":7,"children":8,"page":42},"Get Started","\u002Fget-started","01.get-started",[9,13,17,43,47],{"title":10,"path":11,"stem":12},"Welcome to UniteLabs","\u002Fget-started\u002Fwelcome","01.get-started\u002F00.welcome",{"title":14,"path":15,"stem":16},"How it works","\u002Fget-started\u002Fhow-it-works","01.get-started\u002F01.how-it-works",{"title":18,"path":19,"stem":20,"children":21,"page":42},"Use Cases","\u002Fget-started\u002Fuse-cases","01.get-started\u002F02.use-cases",[22,26,30,34,38],{"title":23,"path":24,"stem":25},"Instrument Control","\u002Fget-started\u002Fuse-cases\u002Flow-level-instrument-control","01.get-started\u002F02.use-cases\u002F10.low-level-instrument-control",{"title":27,"path":28,"stem":29},"Multi-device Control","\u002Fget-started\u002Fuse-cases\u002Fmulti-device-control","01.get-started\u002F02.use-cases\u002F20.multi-device-control",{"title":31,"path":32,"stem":33},"Workflow Orchestration","\u002Fget-started\u002Fuse-cases\u002Fworkflow-orchestration","01.get-started\u002F02.use-cases\u002F30.workflow-orchestration",{"title":35,"path":36,"stem":37},"Custom Apps and LIMS Integration","\u002Fget-started\u002Fuse-cases\u002Fcustom-apps-lims","01.get-started\u002F02.use-cases\u002F40.custom-apps-lims",{"title":39,"path":40,"stem":41},"Scale and Fleet Management","\u002Fget-started\u002Fuse-cases\u002Fscale-and-fleet","01.get-started\u002F02.use-cases\u002F50.scale-and-fleet",false,{"title":44,"path":45,"stem":46},"Lab as Code","\u002Fget-started\u002Fwhy-code","01.get-started\u002F03.why-code",{"title":48,"path":49,"stem":50,"children":51,"page":42},"Setup","\u002Fget-started\u002Fsetup","01.get-started\u002F20.setup",[52,56,60,64,68,72,76],{"title":53,"path":54,"stem":55},"GroundControl","\u002Fget-started\u002Fsetup\u002Fgroundcontrol","01.get-started\u002F20.setup\u002F10.groundcontrol",{"title":57,"path":58,"stem":59},"Network requirements","\u002Fget-started\u002Fsetup\u002Fnetwork-requirements","01.get-started\u002F20.setup\u002F20.network-requirements",{"title":61,"path":62,"stem":63},"Multi-device Networking","\u002Fget-started\u002Fsetup\u002Fmultiple-devices","01.get-started\u002F20.setup\u002F30.multiple-devices",{"title":65,"path":66,"stem":67},"Connect to Platform","\u002Fget-started\u002Fsetup\u002Fconnect-to-platform","01.get-started\u002F20.setup\u002F40.connect-to-platform",{"title":69,"path":70,"stem":71},"Headless install","\u002Fget-started\u002Fsetup\u002Fheadless-install","01.get-started\u002F20.setup\u002F50.headless-install",{"title":73,"path":74,"stem":75},"Raspberry Pi","\u002Fget-started\u002Fsetup\u002Fraspberry-pi","01.get-started\u002F20.setup\u002F55.raspberry-pi",{"title":77,"path":78,"stem":79},"Installation","\u002Fget-started\u002Fsetup\u002Fsdk-installation","01.get-started\u002F20.setup\u002F60.sdk-installation",{"title":81,"path":82,"stem":83,"children":84,"page":42},"Integrate","\u002Fintegrate","02.integrate",[85,89,93,118],{"title":86,"path":87,"stem":88},"What is a connector?","\u002Fintegrate\u002Fwhat-is-a-connector","02.integrate\u002F00.what-is-a-connector",{"title":90,"path":91,"stem":92},"Calling a Connector","\u002Fintegrate\u002Fcontrol-with-code","02.integrate\u002F05.control-with-code",{"title":94,"path":95,"stem":96,"children":97,"page":42},"Concepts","\u002Fintegrate\u002Fconcepts","02.integrate\u002F10.concepts",[98,102,106,110,114],{"title":99,"path":100,"stem":101},"Connector","\u002Fintegrate\u002Fconcepts\u002Fconnector","02.integrate\u002F10.concepts\u002F10.connector",{"title":103,"path":104,"stem":105},"Module","\u002Fintegrate\u002Fconcepts\u002Fmodule","02.integrate\u002F10.concepts\u002F20.module",{"title":107,"path":108,"stem":109},"Action","\u002Fintegrate\u002Fconcepts\u002Faction","02.integrate\u002F10.concepts\u002F30.action",{"title":111,"path":112,"stem":113},"Subscription","\u002Fintegrate\u002Fconcepts\u002Fsubscription","02.integrate\u002F10.concepts\u002F40.subscription",{"title":115,"path":116,"stem":117},"Device","\u002Fintegrate\u002Fconcepts\u002Fdevice","02.integrate\u002F10.concepts\u002F50.device",{"title":119,"path":120,"stem":121,"children":122,"page":42},"Use a connector","\u002Fintegrate\u002Fuse-a-connector","02.integrate\u002F30.use-a-connector",[123,126,130],{"title":53,"path":124,"stem":125},"\u002Fintegrate\u002Fuse-a-connector\u002Fgroundcontrol","02.integrate\u002F30.use-a-connector\u002F10.groundcontrol",{"title":127,"path":128,"stem":129},"Platform","\u002Fintegrate\u002Fuse-a-connector\u002Fplatform","02.integrate\u002F30.use-a-connector\u002F20.platform",{"title":131,"path":132,"stem":133},"UniteLabs SDK & REST API","\u002Fintegrate\u002Fuse-a-connector\u002Fpython","02.integrate\u002F30.use-a-connector\u002F30.python",{"title":135,"path":136,"stem":137,"children":138,"page":42},"Operate","\u002Foperate","03.operate",[139,142,146,186,259],{"title":135,"path":140,"stem":141},"\u002Foperate\u002Foverview","03.operate\u002F00.overview",{"title":143,"path":144,"stem":145},"Your First Protocol","\u002Foperate\u002Fyour-first-protocol","03.operate\u002F05.your-first-protocol",{"title":94,"path":147,"stem":148,"children":149,"page":42},"\u002Foperate\u002Fconcepts","03.operate\u002F10.concepts",[150,154,158,162,166,170,174,178,182],{"title":151,"path":152,"stem":153},"Liquid Handling","\u002Foperate\u002Fconcepts\u002Fliquid-handling","03.operate\u002F10.concepts\u002F10.liquid-handling",{"title":155,"path":156,"stem":157},"Modules","\u002Foperate\u002Fconcepts\u002Fmodules","03.operate\u002F10.concepts\u002F20.modules",{"title":159,"path":160,"stem":161},"Deck","\u002Foperate\u002Fconcepts\u002Fdeck","03.operate\u002F10.concepts\u002F30.deck",{"title":163,"path":164,"stem":165},"Labware","\u002Foperate\u002Fconcepts\u002Flabware","03.operate\u002F10.concepts\u002F40.labware",{"title":167,"path":168,"stem":169},"Liquids","\u002Foperate\u002Fconcepts\u002Fliquids","03.operate\u002F10.concepts\u002F50.liquids",{"title":171,"path":172,"stem":173},"Liquid Classes","\u002Foperate\u002Fconcepts\u002Fliquid-classes","03.operate\u002F10.concepts\u002F60.liquid-classes",{"title":175,"path":176,"stem":177},"Tips and Tip Tracking","\u002Foperate\u002Fconcepts\u002Ftips","03.operate\u002F10.concepts\u002F70.tips",{"title":179,"path":180,"stem":181},"Simulation","\u002Foperate\u002Fconcepts\u002Fsimulation","03.operate\u002F10.concepts\u002F80.simulation",{"title":183,"path":184,"stem":185},"Error Handling","\u002Foperate\u002Fconcepts\u002Ferror-handling","03.operate\u002F10.concepts\u002F90.error-handling",{"title":187,"path":188,"stem":189,"children":190,"page":42},"Guides","\u002Foperate\u002Fguides","03.operate\u002F20.guides",[191,220,232,256],{"title":163,"path":192,"stem":193,"children":194},"\u002Foperate\u002Fguides\u002Flabware","03.operate\u002F20.guides\u002F10.labware\u002Findex",[195,196,200,204,208,212,216],{"title":163,"path":192,"stem":193},{"title":197,"path":198,"stem":199},"Standard Labware","\u002Foperate\u002Fguides\u002Flabware\u002Fstandard-labware","03.operate\u002F20.guides\u002F10.labware\u002F05.standard-labware",{"title":201,"path":202,"stem":203},"Plates","\u002Foperate\u002Fguides\u002Flabware\u002Fplates","03.operate\u002F20.guides\u002F10.labware\u002F10.plates",{"title":205,"path":206,"stem":207},"Tips and Tip Racks","\u002Foperate\u002Fguides\u002Flabware\u002Ftips-and-racks","03.operate\u002F20.guides\u002F10.labware\u002F20.tips-and-racks",{"title":209,"path":210,"stem":211},"Tubes and Tube Racks","\u002Foperate\u002Fguides\u002Flabware\u002Ftubes-and-tube-racks","03.operate\u002F20.guides\u002F10.labware\u002F30.tubes-and-tube-racks",{"title":213,"path":214,"stem":215},"Troughs","\u002Foperate\u002Fguides\u002Flabware\u002Ftroughs","03.operate\u002F20.guides\u002F10.labware\u002F35.troughs",{"title":217,"path":218,"stem":219},"Carriers and Adapters","\u002Foperate\u002Fguides\u002Flabware\u002Fcarriers-and-adapters","03.operate\u002F20.guides\u002F10.labware\u002F40.carriers-and-adapters",{"title":159,"path":221,"stem":222,"children":223,"page":42},"\u002Foperate\u002Fguides\u002Fdeck","03.operate\u002F20.guides\u002F20.deck",[224,228],{"title":225,"path":226,"stem":227},"Building a Deck","\u002Foperate\u002Fguides\u002Fdeck\u002Fbuilding-a-deck","03.operate\u002F20.guides\u002F20.deck\u002F10.building-a-deck",{"title":229,"path":230,"stem":231},"Save\u002FLoad a Deck","\u002Foperate\u002Fguides\u002Fdeck\u002Fsave-load-deck","03.operate\u002F20.guides\u002F20.deck\u002F20.save-load-deck",{"title":233,"path":234,"stem":235,"children":236,"page":42},"Pipetting","\u002Foperate\u002Fguides\u002Fpipetting","03.operate\u002F20.guides\u002F30.pipetting",[237,241,245,249,252],{"title":238,"path":239,"stem":240},"Basic Pipetting","\u002Foperate\u002Fguides\u002Fpipetting\u002Fbasic-pipetting","03.operate\u002F20.guides\u002F30.pipetting\u002F10.basic-pipetting",{"title":242,"path":243,"stem":244},"Advanced Pipetting","\u002Foperate\u002Fguides\u002Fpipetting\u002Fadvanced-pipetting","03.operate\u002F20.guides\u002F30.pipetting\u002F20.advanced-pipetting",{"title":246,"path":247,"stem":248},"Tip Handling","\u002Foperate\u002Fguides\u002Fpipetting\u002Ftip-handling","03.operate\u002F20.guides\u002F30.pipetting\u002F30.tip-handling",{"title":171,"path":250,"stem":251},"\u002Foperate\u002Fguides\u002Fpipetting\u002Fliquid-classes","03.operate\u002F20.guides\u002F30.pipetting\u002F40.liquid-classes",{"title":253,"path":254,"stem":255},"Labware Transport","\u002Foperate\u002Fguides\u002Fpipetting\u002Flabware-transport","03.operate\u002F20.guides\u002F30.pipetting\u002F50.labware-transport",{"title":179,"path":257,"stem":258},"\u002Foperate\u002Fguides\u002Fsimulation","03.operate\u002F20.guides\u002F40.simulation",{"title":260,"path":261,"stem":262,"children":263,"page":42},"Liquid Handler Guides","\u002Foperate\u002Fdevices","03.operate\u002F30.devices",[264,305,330,347],{"title":265,"path":266,"stem":267,"children":268,"page":42},"Hamilton STAR","\u002Foperate\u002Fdevices\u002Fhamilton-star","03.operate\u002F30.devices\u002F10.hamilton-star",[269,273,277,281,285,289,293,297,301],{"title":270,"path":271,"stem":272},"Positioning & Movement","\u002Foperate\u002Fdevices\u002Fhamilton-star\u002Fpositioning","03.operate\u002F30.devices\u002F10.hamilton-star\u002F10.positioning",{"title":274,"path":275,"stem":276},"Gripper Module","\u002Foperate\u002Fdevices\u002Fhamilton-star\u002Fcore-gripper","03.operate\u002F30.devices\u002F10.hamilton-star\u002F20.core-gripper",{"title":278,"path":279,"stem":280},"iSWAP Module","\u002Foperate\u002Fdevices\u002Fhamilton-star\u002Fiswap","03.operate\u002F30.devices\u002F10.hamilton-star\u002F30.iswap",{"title":282,"path":283,"stem":284},"Using TADM","\u002Foperate\u002Fdevices\u002Fhamilton-star\u002Ftadm","03.operate\u002F30.devices\u002F10.hamilton-star\u002F40.tadm",{"title":286,"path":287,"stem":288},"Autoload Module","\u002Foperate\u002Fdevices\u002Fhamilton-star\u002Fautoload","03.operate\u002F30.devices\u002F10.hamilton-star\u002F50.autoload",{"title":290,"path":291,"stem":292},"Waste Block","\u002Foperate\u002Fdevices\u002Fhamilton-star\u002Fwaste-block","03.operate\u002F30.devices\u002F10.hamilton-star\u002F60.waste-block",{"title":294,"path":295,"stem":296},"Complex Mixing","\u002Foperate\u002Fdevices\u002Fhamilton-star\u002Fcomplex-mixing","03.operate\u002F30.devices\u002F10.hamilton-star\u002F66.complex-mixing",{"title":298,"path":299,"stem":300},"Teaching Gripper Paddle Positions","\u002Foperate\u002Fdevices\u002Fhamilton-star\u002Fgripper-positions","03.operate\u002F30.devices\u002F10.hamilton-star\u002F70.gripper-positions",{"title":302,"path":303,"stem":304},"Training a Custom Deck Position With the iSWAP","\u002Foperate\u002Fdevices\u002Fhamilton-star\u002Fcustom-deck-position","03.operate\u002F30.devices\u002F10.hamilton-star\u002F75.custom-deck-position",{"title":306,"path":307,"stem":308,"children":309,"page":42},"Hamilton Vantage","\u002Foperate\u002Fdevices\u002Fhamilton-vantage","03.operate\u002F30.devices\u002F20.hamilton-vantage",[310,314,318,322,326],{"title":311,"path":312,"stem":313},"Waste Configuration","\u002Foperate\u002Fdevices\u002Fhamilton-vantage\u002Fwaste-configuration","03.operate\u002F30.devices\u002F20.hamilton-vantage\u002F05.waste-configuration",{"title":315,"path":316,"stem":317},"Covers and Lights","\u002Foperate\u002Fdevices\u002Fhamilton-vantage\u002Fcovers-and-lights","03.operate\u002F30.devices\u002F20.hamilton-vantage\u002F10.covers-and-lights",{"title":319,"path":320,"stem":321},"IDL Module","\u002Foperate\u002Fdevices\u002Fhamilton-vantage\u002Fidl","03.operate\u002F30.devices\u002F20.hamilton-vantage\u002F20.idl",{"title":323,"path":324,"stem":325},"IPG Module","\u002Foperate\u002Fdevices\u002Fhamilton-vantage\u002Fipg","03.operate\u002F30.devices\u002F20.hamilton-vantage\u002F30.ipg",{"title":327,"path":328,"stem":329},"XL Pipettes","\u002Foperate\u002Fdevices\u002Fhamilton-vantage\u002Fxl-channels","03.operate\u002F30.devices\u002F20.hamilton-vantage\u002F40.xl-channels",{"title":331,"path":332,"stem":333,"children":334,"page":42},"Agilent Bravo","\u002Foperate\u002Fdevices\u002Fagilent-bravo","03.operate\u002F30.devices\u002F30.agilent-bravo",[335,338,341,344],{"title":246,"path":336,"stem":337},"\u002Foperate\u002Fdevices\u002Fagilent-bravo\u002Ftip-handling","03.operate\u002F30.devices\u002F30.agilent-bravo\u002F10.tip-handling",{"title":238,"path":339,"stem":340},"\u002Foperate\u002Fdevices\u002Fagilent-bravo\u002Fbasic-pipetting","03.operate\u002F30.devices\u002F30.agilent-bravo\u002F20.basic-pipetting",{"title":171,"path":342,"stem":343},"\u002Foperate\u002Fdevices\u002Fagilent-bravo\u002Fliquid-classes","03.operate\u002F30.devices\u002F30.agilent-bravo\u002F25.liquid-classes",{"title":274,"path":345,"stem":346},"\u002Foperate\u002Fdevices\u002Fagilent-bravo\u002Fusing-the-gripper","03.operate\u002F30.devices\u002F30.agilent-bravo\u002F30.using-the-gripper",{"title":348,"path":349,"stem":350,"children":351,"page":42},"Tecan FluentControl","\u002Foperate\u002Fdevices\u002Ftecan-fluentcontrol","03.operate\u002F30.devices\u002F40.tecan-fluentcontrol",[352,356,360],{"title":353,"path":354,"stem":355},"Connect & Run a Method","\u002Foperate\u002Fdevices\u002Ftecan-fluentcontrol\u002Fconnect-and-run","03.operate\u002F30.devices\u002F40.tecan-fluentcontrol\u002F10.connect-and-run",{"title":357,"path":358,"stem":359},"Sending XML Commands","\u002Foperate\u002Fdevices\u002Ftecan-fluentcontrol\u002Fsending-xml-commands","03.operate\u002F30.devices\u002F40.tecan-fluentcontrol\u002F20.sending-xml-commands",{"title":361,"path":362,"stem":363},"Full Workflow Example","\u002Foperate\u002Fdevices\u002Ftecan-fluentcontrol\u002Ffull-workflow-example","03.operate\u002F30.devices\u002F40.tecan-fluentcontrol\u002F30.full-workflow-example",{"title":365,"path":366,"stem":367,"children":368,"page":42},"Device Guides","\u002Fdevice-guides","06.device-guides",[369,372,385,402,415],{"title":365,"path":370,"stem":371},"\u002Fdevice-guides\u002Foverview","06.device-guides\u002F00.overview",{"title":373,"path":374,"stem":375,"children":376,"page":42},"Incubation","\u002Fdevice-guides\u002Fincubation","06.device-guides\u002F20.incubation",[377,381],{"title":378,"path":379,"stem":380},"Inheco ODTC","\u002Fdevice-guides\u002Fincubation\u002Finheco-odtc","06.device-guides\u002F20.incubation\u002F10.inheco-odtc",{"title":382,"path":383,"stem":384},"Inheco SCILA","\u002Fdevice-guides\u002Fincubation\u002Finheco-scila","06.device-guides\u002F20.incubation\u002F20.inheco-scila",{"title":386,"path":387,"stem":388,"children":389,"page":42},"Heater-Shakers","\u002Fdevice-guides\u002Fheater-shakers","06.device-guides\u002F30.heater-shakers",[390,394,398],{"title":391,"path":392,"stem":393},"Inheco Thermoshake","\u002Fdevice-guides\u002Fheater-shakers\u002Finheco-thermoshake","06.device-guides\u002F30.heater-shakers\u002F10.inheco-thermoshake",{"title":395,"path":396,"stem":397},"QInstruments Bioshake","\u002Fdevice-guides\u002Fheater-shakers\u002Fqinstruments-bioshake","06.device-guides\u002F30.heater-shakers\u002F20.qinstruments-bioshake",{"title":399,"path":400,"stem":401},"QInstruments ColdPlate","\u002Fdevice-guides\u002Fheater-shakers\u002Fqinstruments-coldplate","06.device-guides\u002F30.heater-shakers\u002F30.qinstruments-coldplate",{"title":403,"path":404,"stem":405,"children":406,"page":42},"Readers","\u002Fdevice-guides\u002Freaders","06.device-guides\u002F40.readers",[407,411],{"title":408,"path":409,"stem":410},"Biotek Gen5","\u002Fdevice-guides\u002Freaders\u002Fbiotek-gen5","06.device-guides\u002F40.readers\u002F10.biotek-gen5",{"title":412,"path":413,"stem":414},"Biotek Synergy H1","\u002Fdevice-guides\u002Freaders\u002Fbiotek-synergy-h1","06.device-guides\u002F40.readers\u002F20.biotek-synergy-H1",{"title":416,"path":417,"stem":418,"children":419,"page":42},"Tilt & Turn","\u002Fdevice-guides\u002Ftilt-and-turn","06.device-guides\u002F50.tilt-and-turn",[420,424],{"title":421,"path":422,"stem":423},"TurnStation","\u002Fdevice-guides\u002Ftilt-and-turn\u002Fqinstruments-turnstation","06.device-guides\u002F50.tilt-and-turn\u002F10.qinstruments-turnstation",{"title":425,"path":426,"stem":427},"TiltStation","\u002Fdevice-guides\u002Ftilt-and-turn\u002Fqinstruments-tiltstation","06.device-guides\u002F50.tilt-and-turn\u002F20.qinstruments-tiltstation",{"title":429,"path":430,"stem":431,"children":432,"page":42},"Automate","\u002Fautomate","07.automate",[433,437,441,445,494],{"title":434,"path":435,"stem":436},"What is a workflow?","\u002Fautomate\u002Fwhat-is-a-workflow","07.automate\u002F00.what-is-a-workflow",{"title":438,"path":439,"stem":440},"Workflow template","\u002Fautomate\u002Fworkflow-template","07.automate\u002F05.workflow-template",{"title":442,"path":443,"stem":444},"Your First Workflow","\u002Fautomate\u002Fyour-first-workflow","07.automate\u002F08.your-first-workflow",{"title":94,"pages":446,"path":456,"stem":457,"children":458,"page":42},[447,448,449,450,451,452,453,454,455],"workflow","phase","step","runs","input","artifacts","logs","human-in-the-loop","error-handling","\u002Fautomate\u002Fconcepts","07.automate\u002F10.concepts",[459,463,467,471,475,479,483,487,491],{"title":460,"path":461,"stem":462},"Workflow","\u002Fautomate\u002Fconcepts\u002Fworkflow","07.automate\u002F10.concepts\u002F10.workflow",{"title":464,"path":465,"stem":466},"Phase","\u002Fautomate\u002Fconcepts\u002Fphase","07.automate\u002F10.concepts\u002F20.phase",{"title":468,"path":469,"stem":470},"Step","\u002Fautomate\u002Fconcepts\u002Fstep","07.automate\u002F10.concepts\u002F30.step",{"title":472,"path":473,"stem":474},"Runs","\u002Fautomate\u002Fconcepts\u002Fruns","07.automate\u002F10.concepts\u002F40.runs",{"title":476,"path":477,"stem":478},"Input","\u002Fautomate\u002Fconcepts\u002Finput","07.automate\u002F10.concepts\u002F50.input",{"title":480,"path":481,"stem":482},"Artifacts","\u002Fautomate\u002Fconcepts\u002Fartifacts","07.automate\u002F10.concepts\u002F60.artifacts",{"title":484,"path":485,"stem":486},"Logs","\u002Fautomate\u002Fconcepts\u002Flogs","07.automate\u002F10.concepts\u002F70.logs",{"title":488,"path":489,"stem":490},"Human in the Loop","\u002Fautomate\u002Fconcepts\u002Fhuman-in-the-loop","07.automate\u002F10.concepts\u002F80.human-in-the-loop",{"title":183,"path":492,"stem":493},"\u002Fautomate\u002Fconcepts\u002Ferror-handling","07.automate\u002F10.concepts\u002F90.error-handling",{"title":187,"path":495,"stem":496,"children":497,"page":42},"\u002Fautomate\u002Fguides","07.automate\u002F25.guides",[498,502,506,510,514,518,522,526],{"title":499,"path":500,"stem":501},"Deploy a workflow","\u002Fautomate\u002Fguides\u002Fdeploy-a-workflow","07.automate\u002F25.guides\u002F30.deploy-a-workflow",{"title":503,"path":504,"stem":505},"Run a workflow","\u002Fautomate\u002Fguides\u002Frun-a-workflow","07.automate\u002F25.guides\u002F35.run-a-workflow",{"title":507,"path":508,"stem":509},"CI\u002FCD for workflows","\u002Fautomate\u002Fguides\u002Fcicd-for-workflows","07.automate\u002F25.guides\u002F40.cicd-for-workflows",{"title":511,"path":512,"stem":513},"HITL basics","\u002Fautomate\u002Fguides\u002Fbasic-hitl","07.automate\u002F25.guides\u002F50.basic-hitl",{"title":515,"path":516,"stem":517},"Typed operator inputs","\u002Fautomate\u002Fguides\u002Ftyped-operator-inputs","07.automate\u002F25.guides\u002F55.typed-operator-inputs",{"title":519,"path":520,"stem":521},"Error recovery","\u002Fautomate\u002Fguides\u002Fbasic-error-handling","07.automate\u002F25.guides\u002F60.basic-error-handling",{"title":523,"path":524,"stem":525},"Advanced error handling","\u002Fautomate\u002Fguides\u002Fadvanced-error-handling","07.automate\u002F25.guides\u002F70.advanced-error-handling",{"title":527,"path":528,"stem":529},"Workflows REST API","\u002Fautomate\u002Fguides\u002Fworkflows-api","07.automate\u002F25.guides\u002F80.workflows-api",{"title":531,"path":532,"stem":533,"children":534,"page":42},"Observe","\u002Fobserve","08.observe",[535,539,555],{"title":536,"path":537,"stem":538},"Overview","\u002Fobserve\u002Foverview","08.observe\u002F10.overview",{"title":94,"path":540,"stem":541,"children":542,"page":42},"\u002Fobserve\u002Fconcepts","08.observe\u002F20.concepts",[543,547,551],{"title":544,"path":545,"stem":546},"Object Storage","\u002Fobserve\u002Fconcepts\u002Fstorage","08.observe\u002F20.concepts\u002F10.storage",{"title":548,"path":549,"stem":550},"Secrets","\u002Fobserve\u002Fconcepts\u002Fsecrets","08.observe\u002F20.concepts\u002F20.secrets",{"title":552,"path":553,"stem":554},"Data sources","\u002Fobserve\u002Fconcepts\u002Fdata-sources","08.observe\u002F20.concepts\u002F30.data-sources",{"title":187,"path":556,"stem":557,"children":558,"page":42},"\u002Fobserve\u002Fguides","08.observe\u002F30.guides",[559,563],{"title":560,"path":561,"stem":562},"File System Connector","\u002Fobserve\u002Fguides\u002Ffilesystem-connector","08.observe\u002F30.guides\u002F10.filesystem-connector",{"title":564,"path":565,"stem":566},"Building an ETL","\u002Fobserve\u002Fguides\u002Fbuilding-an-etl","08.observe\u002F30.guides\u002F20.building-an-etl",{"title":568,"path":569,"stem":570,"children":571,"page":42},"Technical Reference","\u002Ftechnical-reference","10.technical-reference",[572,576,580,592,603,614,624,635],{"title":573,"path":574,"stem":575},"Introduction","\u002Ftechnical-reference\u002Fplatform-blueprint","10.technical-reference\u002F00.platform-blueprint",{"title":577,"path":578,"stem":579},"REST API","\u002Ftechnical-reference\u002Frest-api","10.technical-reference\u002F01.rest-api",{"title":53,"path":581,"stem":582,"children":583,"page":42},"\u002Ftechnical-reference\u002Fgroundcontrol","10.technical-reference\u002F10.groundcontrol",[584,588],{"title":585,"path":586,"stem":587},"Install & Setup","\u002Ftechnical-reference\u002Fgroundcontrol\u002Finstall","10.technical-reference\u002F10.groundcontrol\u002F10.install",{"title":589,"path":590,"stem":591},"Changelog","\u002Ftechnical-reference\u002Fgroundcontrol\u002Fchangelog","10.technical-reference\u002F10.groundcontrol\u002F20.changelog",{"title":593,"path":594,"stem":595,"children":596,"page":42},"UniteLabs SDK","\u002Ftechnical-reference\u002Fpython-sdk","10.technical-reference\u002F20.python-sdk",[597,600],{"title":585,"path":598,"stem":599},"\u002Ftechnical-reference\u002Fpython-sdk\u002Finstall","10.technical-reference\u002F20.python-sdk\u002F10.install",{"title":589,"path":601,"stem":602},"\u002Ftechnical-reference\u002Fpython-sdk\u002Fchangelog","10.technical-reference\u002F20.python-sdk\u002F20.changelog",{"title":604,"path":605,"stem":606,"children":607,"page":42},"Liquid Handling SDK","\u002Ftechnical-reference\u002Fpython-liquid-handling-sdk","10.technical-reference\u002F30.python-liquid-handling-sdk",[608,611],{"title":585,"path":609,"stem":610},"\u002Ftechnical-reference\u002Fpython-liquid-handling-sdk\u002Finstall","10.technical-reference\u002F30.python-liquid-handling-sdk\u002F10.install",{"title":589,"path":612,"stem":613},"\u002Ftechnical-reference\u002Fpython-liquid-handling-sdk\u002Fchangelog","10.technical-reference\u002F30.python-liquid-handling-sdk\u002F20.changelog",{"title":163,"path":615,"stem":616,"children":617,"page":42},"\u002Ftechnical-reference\u002Flabware","10.technical-reference\u002F40.labware",[618,621],{"title":585,"path":619,"stem":620},"\u002Ftechnical-reference\u002Flabware\u002Finstall","10.technical-reference\u002F40.labware\u002F10.install",{"title":589,"path":622,"stem":623},"\u002Ftechnical-reference\u002Flabware\u002Fchangelog","10.technical-reference\u002F40.labware\u002F20.changelog",{"title":625,"path":626,"stem":627,"children":628,"page":42},"Python Omnibus","\u002Ftechnical-reference\u002Fpython-omnibus","10.technical-reference\u002F50.python-omnibus",[629,632],{"title":585,"path":630,"stem":631},"\u002Ftechnical-reference\u002Fpython-omnibus\u002Finstall","10.technical-reference\u002F50.python-omnibus\u002F10.install",{"title":589,"path":633,"stem":634},"\u002Ftechnical-reference\u002Fpython-omnibus\u002Fchangelog","10.technical-reference\u002F50.python-omnibus\u002F20.changelog",{"title":636,"path":637,"stem":638,"children":639,"page":42},"Python CDK","\u002Ftechnical-reference\u002Fpython-cdk","10.technical-reference\u002F60.python-cdk",[640,643],{"title":585,"path":641,"stem":642},"\u002Ftechnical-reference\u002Fpython-cdk\u002Finstall","10.technical-reference\u002F60.python-cdk\u002F10.install",{"title":589,"path":644,"stem":645},"\u002Ftechnical-reference\u002Fpython-cdk\u002Fchangelog","10.technical-reference\u002F60.python-cdk\u002F20.changelog",{"title":647,"path":648,"stem":649,"children":650},"Connector Development (CDK)","\u002Fconnector-development","20.connector-development",[651,653,672,705,713,744],{"title":647,"path":648,"stem":652},"20.connector-development\u002Findex",{"title":654,"path":655,"stem":656,"children":657,"page":42},"Getting Started","\u002Fconnector-development\u002Fgetting-started","20.connector-development\u002F10.getting-started",[658,661,665,668],{"title":536,"path":659,"stem":660},"\u002Fconnector-development\u002Fgetting-started\u002Foverview","20.connector-development\u002F10.getting-started\u002F10.overview",{"title":662,"path":663,"stem":664},"What's new","\u002Fconnector-development\u002Fgetting-started\u002Fwhats-new","20.connector-development\u002F10.getting-started\u002F20.whats-new",{"title":77,"path":666,"stem":667},"\u002Fconnector-development\u002Fgetting-started\u002Finstallation","20.connector-development\u002F10.getting-started\u002F30.installation",{"title":669,"path":670,"stem":671},"Contributing","\u002Fconnector-development\u002Fgetting-started\u002Fcontributing","20.connector-development\u002F10.getting-started\u002F40.contributing",{"title":673,"path":674,"stem":675,"children":676,"page":42},"Tutorial","\u002Fconnector-development\u002Ftutorial","20.connector-development\u002F20.tutorial",[677,681,685,689,693,697,701],{"title":678,"path":679,"stem":680},"Walkthrough","\u002Fconnector-development\u002Ftutorial\u002Fwalkthrough","20.connector-development\u002F20.tutorial\u002F00.walkthrough",{"title":682,"path":683,"stem":684},"SiLA Endpoints","\u002Fconnector-development\u002Ftutorial\u002Fsila-endpoints","20.connector-development\u002F20.tutorial\u002F10.sila-endpoints",{"title":686,"path":687,"stem":688},"Data Endpoints","\u002Fconnector-development\u002Ftutorial\u002Fdata-endpoints","20.connector-development\u002F20.tutorial\u002F20.data-endpoints",{"title":690,"path":691,"stem":692},"Controls","\u002Fconnector-development\u002Ftutorial\u002Fcontrols","20.connector-development\u002F20.tutorial\u002F30.controls",{"title":694,"path":695,"stem":696},"SiLA Data Types","\u002Fconnector-development\u002Ftutorial\u002Fdata-types","20.connector-development\u002F20.tutorial\u002F40.data-types",{"title":698,"path":699,"stem":700},"Feature","\u002Fconnector-development\u002Ftutorial\u002Fconnector-structure","20.connector-development\u002F20.tutorial\u002F70.connector-structure",{"title":702,"path":703,"stem":704},"Hardware Communication","\u002Fconnector-development\u002Ftutorial\u002Fhardware-communication","20.connector-development\u002F20.tutorial\u002F90.hardware-communication",{"title":94,"path":706,"stem":707,"children":708,"page":42},"\u002Fconnector-development\u002Fconcepts","20.connector-development\u002F30.concepts",[709],{"title":710,"path":711,"stem":712},"SiLA","\u002Fconnector-development\u002Fconcepts\u002Fsila","20.connector-development\u002F30.concepts\u002Fsila",{"title":187,"path":714,"stem":715,"children":716,"page":42},"\u002Fconnector-development\u002Fguides","20.connector-development\u002F40.guides",[717,721,725,729,733,736,740],{"title":718,"path":719,"stem":720},"Configuration","\u002Fconnector-development\u002Fguides\u002Fconfiguration","20.connector-development\u002F40.guides\u002F20.configuration",{"title":722,"path":723,"stem":724},"Deployment","\u002Fconnector-development\u002Fguides\u002Fdeployment","20.connector-development\u002F40.guides\u002F30.deployment",{"title":726,"path":727,"stem":728},"Security","\u002Fconnector-development\u002Fguides\u002Fsecurity","20.connector-development\u002F40.guides\u002F40.security",{"title":730,"path":731,"stem":732},"Subscriptions","\u002Fconnector-development\u002Fguides\u002Fsubscriptions","20.connector-development\u002F40.guides\u002F45.subscriptions",{"title":183,"path":734,"stem":735},"\u002Fconnector-development\u002Fguides\u002Ferror-handling","20.connector-development\u002F40.guides\u002F50.error-handling",{"title":737,"path":738,"stem":739},"Serial Troubleshooting","\u002Fconnector-development\u002Fguides\u002Fserial-troubleshooting","20.connector-development\u002F40.guides\u002F70.serial-troubleshooting",{"title":741,"path":742,"stem":743},"Testing","\u002Fconnector-development\u002Fguides\u002Ftesting","20.connector-development\u002F40.guides\u002F80.testing",{"title":745,"path":746,"stem":747,"children":748},"References","\u002Fconnector-development\u002Freference","20.connector-development\u002F50.reference\u002Findex",[749],{"title":745,"path":746,"stem":747},{"id":751,"title":183,"body":752,"description":2437,"extension":2438,"links":2439,"meta":2440,"navigation":846,"path":184,"seo":2441,"stem":185,"__hash__":2442},"docs\u002F03.operate\u002F10.concepts\u002F90.error-handling.md",{"type":753,"value":754,"toc":2424},"minimark",[755,764,772,781,786,798,1159,1170,1180,1184,1189,1192,1374,1378,1381,1458,1461,1465,1468,1710,1713,1717,1720,1845,1849,1872,2036,2049,2053,2056,2178,2181,2337,2343,2347,2350,2395,2399,2420],[756,757,758,759,763],"p",{},"In most software, an unhandled exception means a bad user experience. In lab automation, it can mean a plate left in an incubator overnight, a gripper holding a tube, or reagents dispensed twice. The goal of error handling here is not just to recover gracefully; it is to leave every instrument in a ",[760,761,762],"strong",{},"safe, known state"," before the script can safely continue or exits.",[756,765,766,767,771],{},"Every error handler should ask: ",[768,769,770],"em",{},"is the instrument in a safe state?"," before re-raising or continuing.",[756,773,774,775,780],{},"On this page you write error handlers yourself. When you're ready to have the workflow engine retry, pause, and resume on your behalf, see ",[776,777,779],"a",{"href":778},"\u002Fautomate\u002Fconcepts\u002Ferror-handling\u002F","Error handling"," in Automate — same idea, moved from reactive code to declared policy.",[782,783,785],"h2",{"id":784},"basic-structure","Basic structure",[756,787,788,789,793,794,797],{},"Wrap your method steps with ",[790,791,792],"code",{},"try \u002F except \u002F finally",". The ",[790,795,796],{},"finally"," block runs regardless of success or failure, so use it for cleanup that must always happen.",[799,800,805],"pre",{"className":801,"code":802,"language":803,"meta":804,"style":804},"language-python shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import logging\nfrom unitelabs.sdk import AsyncApiClient\n\nasync def run_method():\n    async with AsyncApiClient() as client:\n        incubator = await client.get_service_by_name(\"Incubator\")\n        gripper   = await client.get_service_by_name(\"Gripper\")\n\n        try:\n            await incubator.door_controller.open()\n            await gripper.arm_controller.move_plate(source=\"A1\", destination=\"B1\")\n            await incubator.door_controller.close()\n\n        except Exception as e:\n            logging.exception(\"Step failed — attempting safe state\")\n            await incubator.door_controller.close()  # always close the door\n            raise\n\n        finally:\n            await gripper.arm_controller.home()  # runs whether or not an exception occurred\n","python","",[790,806,807,820,841,848,865,889,923,950,955,963,986,1036,1054,1059,1076,1098,1119,1125,1130,1138],{"__ignoreMap":804},[808,809,812,816],"span",{"class":810,"line":811},"line",1,[808,813,815],{"class":814},"s7zQu","import",[808,817,819],{"class":818},"sTEyZ"," logging\n",[808,821,823,826,829,833,836,838],{"class":810,"line":822},2,[808,824,825],{"class":814},"from",[808,827,828],{"class":818}," unitelabs",[808,830,832],{"class":831},"sMK4o",".",[808,834,835],{"class":818},"sdk ",[808,837,815],{"class":814},[808,839,840],{"class":818}," AsyncApiClient\n",[808,842,844],{"class":810,"line":843},3,[808,845,847],{"emptyLinePlaceholder":846},true,"\n",[808,849,851,855,858,862],{"class":810,"line":850},4,[808,852,854],{"class":853},"spNyl","async",[808,856,857],{"class":853}," def",[808,859,861],{"class":860},"s2Zo4"," run_method",[808,863,864],{"class":831},"():\n",[808,866,868,871,874,877,880,883,886],{"class":810,"line":867},5,[808,869,870],{"class":814},"    async",[808,872,873],{"class":814}," with",[808,875,876],{"class":860}," AsyncApiClient",[808,878,879],{"class":831},"()",[808,881,882],{"class":814}," as",[808,884,885],{"class":818}," client",[808,887,888],{"class":831},":\n",[808,890,892,895,898,901,903,905,908,911,914,918,920],{"class":810,"line":891},6,[808,893,894],{"class":818},"        incubator ",[808,896,897],{"class":831},"=",[808,899,900],{"class":814}," await",[808,902,885],{"class":818},[808,904,832],{"class":831},[808,906,907],{"class":860},"get_service_by_name",[808,909,910],{"class":831},"(",[808,912,913],{"class":831},"\"",[808,915,917],{"class":916},"sfazB","Incubator",[808,919,913],{"class":831},[808,921,922],{"class":831},")\n",[808,924,926,929,931,933,935,937,939,941,943,946,948],{"class":810,"line":925},7,[808,927,928],{"class":818},"        gripper   ",[808,930,897],{"class":831},[808,932,900],{"class":814},[808,934,885],{"class":818},[808,936,832],{"class":831},[808,938,907],{"class":860},[808,940,910],{"class":831},[808,942,913],{"class":831},[808,944,945],{"class":916},"Gripper",[808,947,913],{"class":831},[808,949,922],{"class":831},[808,951,953],{"class":810,"line":952},8,[808,954,847],{"emptyLinePlaceholder":846},[808,956,958,961],{"class":810,"line":957},9,[808,959,960],{"class":814},"        try",[808,962,888],{"class":831},[808,964,966,969,972,974,978,980,983],{"class":810,"line":965},10,[808,967,968],{"class":814},"            await",[808,970,971],{"class":818}," incubator",[808,973,832],{"class":831},[808,975,977],{"class":976},"swJcz","door_controller",[808,979,832],{"class":831},[808,981,982],{"class":860},"open",[808,984,985],{"class":831},"()\n",[808,987,989,991,994,996,999,1001,1004,1006,1010,1012,1014,1017,1019,1022,1025,1027,1029,1032,1034],{"class":810,"line":988},11,[808,990,968],{"class":814},[808,992,993],{"class":818}," gripper",[808,995,832],{"class":831},[808,997,998],{"class":976},"arm_controller",[808,1000,832],{"class":831},[808,1002,1003],{"class":860},"move_plate",[808,1005,910],{"class":831},[808,1007,1009],{"class":1008},"sHdIc","source",[808,1011,897],{"class":831},[808,1013,913],{"class":831},[808,1015,1016],{"class":916},"A1",[808,1018,913],{"class":831},[808,1020,1021],{"class":831},",",[808,1023,1024],{"class":1008}," destination",[808,1026,897],{"class":831},[808,1028,913],{"class":831},[808,1030,1031],{"class":916},"B1",[808,1033,913],{"class":831},[808,1035,922],{"class":831},[808,1037,1039,1041,1043,1045,1047,1049,1052],{"class":810,"line":1038},12,[808,1040,968],{"class":814},[808,1042,971],{"class":818},[808,1044,832],{"class":831},[808,1046,977],{"class":976},[808,1048,832],{"class":831},[808,1050,1051],{"class":860},"close",[808,1053,985],{"class":831},[808,1055,1057],{"class":810,"line":1056},13,[808,1058,847],{"emptyLinePlaceholder":846},[808,1060,1062,1065,1069,1071,1074],{"class":810,"line":1061},14,[808,1063,1064],{"class":814},"        except",[808,1066,1068],{"class":1067},"sBMFI"," Exception",[808,1070,882],{"class":814},[808,1072,1073],{"class":818}," e",[808,1075,888],{"class":831},[808,1077,1079,1082,1084,1087,1089,1091,1094,1096],{"class":810,"line":1078},15,[808,1080,1081],{"class":818},"            logging",[808,1083,832],{"class":831},[808,1085,1086],{"class":860},"exception",[808,1088,910],{"class":831},[808,1090,913],{"class":831},[808,1092,1093],{"class":916},"Step failed — attempting safe state",[808,1095,913],{"class":831},[808,1097,922],{"class":831},[808,1099,1101,1103,1105,1107,1109,1111,1113,1115],{"class":810,"line":1100},16,[808,1102,968],{"class":814},[808,1104,971],{"class":818},[808,1106,832],{"class":831},[808,1108,977],{"class":976},[808,1110,832],{"class":831},[808,1112,1051],{"class":860},[808,1114,879],{"class":831},[808,1116,1118],{"class":1117},"sHwdD","  # always close the door\n",[808,1120,1122],{"class":810,"line":1121},17,[808,1123,1124],{"class":814},"            raise\n",[808,1126,1128],{"class":810,"line":1127},18,[808,1129,847],{"emptyLinePlaceholder":846},[808,1131,1133,1136],{"class":810,"line":1132},19,[808,1134,1135],{"class":814},"        finally",[808,1137,888],{"class":831},[808,1139,1141,1143,1145,1147,1149,1151,1154,1156],{"class":810,"line":1140},20,[808,1142,968],{"class":814},[808,1144,993],{"class":818},[808,1146,832],{"class":831},[808,1148,998],{"class":976},[808,1150,832],{"class":831},[808,1152,1153],{"class":860},"home",[808,1155,879],{"class":831},[808,1157,1158],{"class":1117},"  # runs whether or not an exception occurred\n",[756,1160,1161,1162,1165,1166,1169],{},"Use ",[790,1163,1164],{},"logging.exception"," rather than ",[790,1167,1168],{},"print","; it captures the full traceback and writes it to your log file.",[756,1171,1172,1173,1175,1176,1179],{},"Keep ",[790,1174,796],{}," blocks simple. If safe-state actions can themselves raise, wrap them in their own ",[790,1177,1178],{},"try \u002F except"," to prevent masking the original error.",[782,1181,1183],{"id":1182},"common-failure-patterns","Common failure patterns",[1185,1186,1188],"h3",{"id":1187},"device-timeout","Device timeout",[756,1190,1191],{},"The instrument did not respond in time. Retry once with a short delay, then raise:",[799,1193,1195],{"className":801,"code":1194,"language":803,"meta":804,"style":804},"for attempt in range(2):\n    try:\n        result = await reader.measurement.read_absorbance(well=\"A1\")\n        break\n    except TimeoutError:\n        if attempt == 1:\n            logging.error(\"Reader timed out after 2 attempts\")\n            raise\n        logging.warning(\"Reader timeout on attempt %d — retrying\", attempt + 1)\n        await asyncio.sleep(5)\n",[790,1196,1197,1220,1227,1264,1269,1279,1294,1314,1318,1354],{"__ignoreMap":804},[808,1198,1199,1202,1205,1208,1211,1213,1217],{"class":810,"line":811},[808,1200,1201],{"class":814},"for",[808,1203,1204],{"class":818}," attempt ",[808,1206,1207],{"class":814},"in",[808,1209,1210],{"class":860}," range",[808,1212,910],{"class":831},[808,1214,1216],{"class":1215},"sbssI","2",[808,1218,1219],{"class":831},"):\n",[808,1221,1222,1225],{"class":810,"line":822},[808,1223,1224],{"class":814},"    try",[808,1226,888],{"class":831},[808,1228,1229,1232,1234,1236,1239,1241,1244,1246,1249,1251,1254,1256,1258,1260,1262],{"class":810,"line":843},[808,1230,1231],{"class":818},"        result ",[808,1233,897],{"class":831},[808,1235,900],{"class":814},[808,1237,1238],{"class":818}," reader",[808,1240,832],{"class":831},[808,1242,1243],{"class":976},"measurement",[808,1245,832],{"class":831},[808,1247,1248],{"class":860},"read_absorbance",[808,1250,910],{"class":831},[808,1252,1253],{"class":1008},"well",[808,1255,897],{"class":831},[808,1257,913],{"class":831},[808,1259,1016],{"class":916},[808,1261,913],{"class":831},[808,1263,922],{"class":831},[808,1265,1266],{"class":810,"line":850},[808,1267,1268],{"class":814},"        break\n",[808,1270,1271,1274,1277],{"class":810,"line":867},[808,1272,1273],{"class":814},"    except",[808,1275,1276],{"class":1067}," TimeoutError",[808,1278,888],{"class":831},[808,1280,1281,1284,1286,1289,1292],{"class":810,"line":891},[808,1282,1283],{"class":814},"        if",[808,1285,1204],{"class":818},[808,1287,1288],{"class":831},"==",[808,1290,1291],{"class":1215}," 1",[808,1293,888],{"class":831},[808,1295,1296,1298,1300,1303,1305,1307,1310,1312],{"class":810,"line":925},[808,1297,1081],{"class":818},[808,1299,832],{"class":831},[808,1301,1302],{"class":860},"error",[808,1304,910],{"class":831},[808,1306,913],{"class":831},[808,1308,1309],{"class":916},"Reader timed out after 2 attempts",[808,1311,913],{"class":831},[808,1313,922],{"class":831},[808,1315,1316],{"class":810,"line":952},[808,1317,1124],{"class":814},[808,1319,1320,1323,1325,1328,1330,1332,1335,1338,1341,1343,1345,1347,1350,1352],{"class":810,"line":957},[808,1321,1322],{"class":818},"        logging",[808,1324,832],{"class":831},[808,1326,1327],{"class":860},"warning",[808,1329,910],{"class":831},[808,1331,913],{"class":831},[808,1333,1334],{"class":916},"Reader timeout on attempt ",[808,1336,1337],{"class":1215},"%d",[808,1339,1340],{"class":916}," — retrying",[808,1342,913],{"class":831},[808,1344,1021],{"class":831},[808,1346,1204],{"class":860},[808,1348,1349],{"class":831},"+",[808,1351,1291],{"class":1215},[808,1353,922],{"class":831},[808,1355,1356,1359,1362,1364,1367,1369,1372],{"class":810,"line":965},[808,1357,1358],{"class":814},"        await",[808,1360,1361],{"class":818}," asyncio",[808,1363,832],{"class":831},[808,1365,1366],{"class":860},"sleep",[808,1368,910],{"class":831},[808,1370,1371],{"class":1215},"5",[808,1373,922],{"class":831},[1185,1375,1377],{"id":1376},"unexpected-device-state","Unexpected device state",[756,1379,1380],{},"Never silently continue when the instrument reports a state your script did not expect. Raise immediately with enough context to diagnose:",[799,1382,1384],{"className":801,"code":1383,"language":803,"meta":804,"style":804},"status = await incubator.heating.get_status()\nif not status.door_closed:\n    raise RuntimeError(\n        f\"Incubator door is open before step — expected closed. \"\n        f\"Check that no plates were left inside.\"\n    )\n",[790,1385,1386,1409,1427,1438,1446,1453],{"__ignoreMap":804},[808,1387,1388,1391,1393,1395,1397,1399,1402,1404,1407],{"class":810,"line":811},[808,1389,1390],{"class":818},"status ",[808,1392,897],{"class":831},[808,1394,900],{"class":814},[808,1396,971],{"class":818},[808,1398,832],{"class":831},[808,1400,1401],{"class":976},"heating",[808,1403,832],{"class":831},[808,1405,1406],{"class":860},"get_status",[808,1408,985],{"class":831},[808,1410,1411,1414,1417,1420,1422,1425],{"class":810,"line":822},[808,1412,1413],{"class":814},"if",[808,1415,1416],{"class":831}," not",[808,1418,1419],{"class":818}," status",[808,1421,832],{"class":831},[808,1423,1424],{"class":976},"door_closed",[808,1426,888],{"class":831},[808,1428,1429,1432,1435],{"class":810,"line":843},[808,1430,1431],{"class":814},"    raise",[808,1433,1434],{"class":1067}," RuntimeError",[808,1436,1437],{"class":831},"(\n",[808,1439,1440,1443],{"class":810,"line":850},[808,1441,1442],{"class":853},"        f",[808,1444,1445],{"class":916},"\"Incubator door is open before step — expected closed. \"\n",[808,1447,1448,1450],{"class":810,"line":867},[808,1449,1442],{"class":853},[808,1451,1452],{"class":916},"\"Check that no plates were left inside.\"\n",[808,1454,1455],{"class":810,"line":891},[808,1456,1457],{"class":831},"    )\n",[756,1459,1460],{},"Silence here turns a detectable misconfiguration into an unexplained result.",[1185,1462,1464],{"id":1463},"partial-completion","Partial completion",[756,1466,1467],{},"If the method fails halfway through, write whatever results you have before re-raising. Data from completed samples is valuable even when the run did not finish:",[799,1469,1471],{"className":801,"code":1470,"language":803,"meta":804,"style":804},"results = []\ntry:\n    for sample in samples:\n        measurement = await reader.measurement.read_absorbance(well=sample[\"position\"])\n        results.append({\"id\": sample[\"id\"], \"absorbance\": measurement.value})\nexcept Exception:\n    logging.error(\"Run aborted — saving %d partial results\", len(results))\n    with open(\"results_partial.json\", \"w\") as f:\n        json.dump(results, f)\n    raise\n",[790,1472,1473,1483,1490,1505,1546,1604,1613,1649,1685,1705],{"__ignoreMap":804},[808,1474,1475,1478,1480],{"class":810,"line":811},[808,1476,1477],{"class":818},"results ",[808,1479,897],{"class":831},[808,1481,1482],{"class":831}," []\n",[808,1484,1485,1488],{"class":810,"line":822},[808,1486,1487],{"class":814},"try",[808,1489,888],{"class":831},[808,1491,1492,1495,1498,1500,1503],{"class":810,"line":843},[808,1493,1494],{"class":814},"    for",[808,1496,1497],{"class":818}," sample ",[808,1499,1207],{"class":814},[808,1501,1502],{"class":818}," samples",[808,1504,888],{"class":831},[808,1506,1507,1510,1512,1514,1516,1518,1520,1522,1524,1526,1528,1530,1533,1536,1538,1541,1543],{"class":810,"line":850},[808,1508,1509],{"class":818},"        measurement ",[808,1511,897],{"class":831},[808,1513,900],{"class":814},[808,1515,1238],{"class":818},[808,1517,832],{"class":831},[808,1519,1243],{"class":976},[808,1521,832],{"class":831},[808,1523,1248],{"class":860},[808,1525,910],{"class":831},[808,1527,1253],{"class":1008},[808,1529,897],{"class":831},[808,1531,1532],{"class":860},"sample",[808,1534,1535],{"class":831},"[",[808,1537,913],{"class":831},[808,1539,1540],{"class":916},"position",[808,1542,913],{"class":831},[808,1544,1545],{"class":831},"])\n",[808,1547,1548,1551,1553,1556,1559,1561,1564,1566,1569,1572,1574,1576,1578,1580,1583,1586,1589,1591,1593,1596,1598,1601],{"class":810,"line":867},[808,1549,1550],{"class":818},"        results",[808,1552,832],{"class":831},[808,1554,1555],{"class":860},"append",[808,1557,1558],{"class":831},"({",[808,1560,913],{"class":831},[808,1562,1563],{"class":916},"id",[808,1565,913],{"class":831},[808,1567,1568],{"class":831},":",[808,1570,1571],{"class":860}," sample",[808,1573,1535],{"class":831},[808,1575,913],{"class":831},[808,1577,1563],{"class":916},[808,1579,913],{"class":831},[808,1581,1582],{"class":831},"],",[808,1584,1585],{"class":831}," \"",[808,1587,1588],{"class":916},"absorbance",[808,1590,913],{"class":831},[808,1592,1568],{"class":831},[808,1594,1595],{"class":860}," measurement",[808,1597,832],{"class":831},[808,1599,1600],{"class":976},"value",[808,1602,1603],{"class":831},"})\n",[808,1605,1606,1609,1611],{"class":810,"line":891},[808,1607,1608],{"class":814},"except",[808,1610,1068],{"class":1067},[808,1612,888],{"class":831},[808,1614,1615,1618,1620,1622,1624,1626,1629,1631,1634,1636,1638,1641,1643,1646],{"class":810,"line":925},[808,1616,1617],{"class":818},"    logging",[808,1619,832],{"class":831},[808,1621,1302],{"class":860},[808,1623,910],{"class":831},[808,1625,913],{"class":831},[808,1627,1628],{"class":916},"Run aborted — saving ",[808,1630,1337],{"class":1215},[808,1632,1633],{"class":916}," partial results",[808,1635,913],{"class":831},[808,1637,1021],{"class":831},[808,1639,1640],{"class":860}," len",[808,1642,910],{"class":831},[808,1644,1645],{"class":860},"results",[808,1647,1648],{"class":831},"))\n",[808,1650,1651,1654,1657,1659,1661,1664,1666,1668,1670,1673,1675,1678,1680,1683],{"class":810,"line":952},[808,1652,1653],{"class":814},"    with",[808,1655,1656],{"class":860}," open",[808,1658,910],{"class":831},[808,1660,913],{"class":831},[808,1662,1663],{"class":916},"results_partial.json",[808,1665,913],{"class":831},[808,1667,1021],{"class":831},[808,1669,1585],{"class":831},[808,1671,1672],{"class":916},"w",[808,1674,913],{"class":831},[808,1676,1677],{"class":831},")",[808,1679,882],{"class":814},[808,1681,1682],{"class":818}," f",[808,1684,888],{"class":831},[808,1686,1687,1690,1692,1695,1697,1699,1701,1703],{"class":810,"line":957},[808,1688,1689],{"class":818},"        json",[808,1691,832],{"class":831},[808,1693,1694],{"class":860},"dump",[808,1696,910],{"class":831},[808,1698,1645],{"class":860},[808,1700,1021],{"class":831},[808,1702,1682],{"class":860},[808,1704,922],{"class":831},[808,1706,1707],{"class":810,"line":965},[808,1708,1709],{"class":814},"    raise\n",[756,1711,1712],{},"Writing results incrementally during the loop makes this automatic. Your method accumulates partial data as it runs rather than buffering everything until the end.",[1185,1714,1716],{"id":1715},"connection-loss","Connection loss",[756,1718,1719],{},"Catch connection errors separately from device-logic errors, since the recovery is different:",[799,1721,1723],{"className":801,"code":1722,"language":803,"meta":804,"style":804},"try:\n    await thermocycler.temperature_controller.set_target_temperature(target_temperature=37)\nexcept ConnectionError as e:\n    logging.error(\"Lost connection to thermocycler: %s\", e)\n    # Connectors handle reconnection to the instrument automatically\n    # Automatic retries with a delay or exponential backoff may be sufficient\n    raise\nexcept Exception:\n    logging.exception(\"Thermocycler command failed\")\n    raise\n",[790,1724,1725,1731,1761,1774,1800,1805,1810,1814,1822,1841],{"__ignoreMap":804},[808,1726,1727,1729],{"class":810,"line":811},[808,1728,1487],{"class":814},[808,1730,888],{"class":831},[808,1732,1733,1736,1739,1741,1744,1746,1749,1751,1754,1756,1759],{"class":810,"line":822},[808,1734,1735],{"class":814},"    await",[808,1737,1738],{"class":818}," thermocycler",[808,1740,832],{"class":831},[808,1742,1743],{"class":976},"temperature_controller",[808,1745,832],{"class":831},[808,1747,1748],{"class":860},"set_target_temperature",[808,1750,910],{"class":831},[808,1752,1753],{"class":1008},"target_temperature",[808,1755,897],{"class":831},[808,1757,1758],{"class":1215},"37",[808,1760,922],{"class":831},[808,1762,1763,1765,1768,1770,1772],{"class":810,"line":843},[808,1764,1608],{"class":814},[808,1766,1767],{"class":1067}," ConnectionError",[808,1769,882],{"class":814},[808,1771,1073],{"class":818},[808,1773,888],{"class":831},[808,1775,1776,1778,1780,1782,1784,1786,1789,1792,1794,1796,1798],{"class":810,"line":850},[808,1777,1617],{"class":818},[808,1779,832],{"class":831},[808,1781,1302],{"class":860},[808,1783,910],{"class":831},[808,1785,913],{"class":831},[808,1787,1788],{"class":916},"Lost connection to thermocycler: ",[808,1790,1791],{"class":1215},"%s",[808,1793,913],{"class":831},[808,1795,1021],{"class":831},[808,1797,1073],{"class":860},[808,1799,922],{"class":831},[808,1801,1802],{"class":810,"line":867},[808,1803,1804],{"class":1117},"    # Connectors handle reconnection to the instrument automatically\n",[808,1806,1807],{"class":810,"line":891},[808,1808,1809],{"class":1117},"    # Automatic retries with a delay or exponential backoff may be sufficient\n",[808,1811,1812],{"class":810,"line":925},[808,1813,1709],{"class":814},[808,1815,1816,1818,1820],{"class":810,"line":952},[808,1817,1608],{"class":814},[808,1819,1068],{"class":1067},[808,1821,888],{"class":831},[808,1823,1824,1826,1828,1830,1832,1834,1837,1839],{"class":810,"line":957},[808,1825,1617],{"class":818},[808,1827,832],{"class":831},[808,1829,1086],{"class":860},[808,1831,910],{"class":831},[808,1833,913],{"class":831},[808,1835,1836],{"class":916},"Thermocycler command failed",[808,1838,913],{"class":831},[808,1840,922],{"class":831},[808,1842,1843],{"class":810,"line":965},[808,1844,1709],{"class":814},[782,1846,1848],{"id":1847},"marking-labware-as-errored","Marking labware as errored",[756,1850,1851,1852,1855,1856,1859,1860,1863,1864,1867,1868,1871],{},"After a failed tip pickup or transport step you often cannot trust what is physically in a spot — a tube may have been dropped, a tip half-mounted. Since labware 0.29.0, you can record that uncertainty on the labware itself instead of guessing later. ",[790,1853,1854],{},"Spot.mark_errored()"," (available on ",[790,1857,1858],{},"TipSpot"," and ",[790,1861,1862],{},"TubeSpot",") clears whatever the spot held and replaces it with an ",[790,1865,1866],{},"Unknown"," placeholder, and ",[790,1869,1870],{},"spot.errored"," reports the state:",[799,1873,1875],{"className":801,"code":1874,"language":803,"meta":804,"style":804},"from unitelabs.labware import Unknown\n\nspot = tip_rack[\"A1\"]\n\ntry:\n    await hamilton.pipettes.pick_up_tips(channels=[0], spots=[spot])\nexcept Exception:\n    spot.mark_errored()   # contents are now Unknown\n    raise\n\nspot.errored             # True\nisinstance(spot.get(), Unknown)   # True\n",[790,1876,1877,1893,1897,1918,1922,1928,1968,1976,1991,1995,1999,2011],{"__ignoreMap":804},[808,1878,1879,1881,1883,1885,1888,1890],{"class":810,"line":811},[808,1880,825],{"class":814},[808,1882,828],{"class":818},[808,1884,832],{"class":831},[808,1886,1887],{"class":818},"labware ",[808,1889,815],{"class":814},[808,1891,1892],{"class":818}," Unknown\n",[808,1894,1895],{"class":810,"line":822},[808,1896,847],{"emptyLinePlaceholder":846},[808,1898,1899,1902,1904,1907,1909,1911,1913,1915],{"class":810,"line":843},[808,1900,1901],{"class":818},"spot ",[808,1903,897],{"class":831},[808,1905,1906],{"class":818}," tip_rack",[808,1908,1535],{"class":831},[808,1910,913],{"class":831},[808,1912,1016],{"class":916},[808,1914,913],{"class":831},[808,1916,1917],{"class":831},"]\n",[808,1919,1920],{"class":810,"line":850},[808,1921,847],{"emptyLinePlaceholder":846},[808,1923,1924,1926],{"class":810,"line":867},[808,1925,1487],{"class":814},[808,1927,888],{"class":831},[808,1929,1930,1932,1935,1937,1940,1942,1945,1947,1950,1953,1956,1958,1961,1963,1966],{"class":810,"line":891},[808,1931,1735],{"class":814},[808,1933,1934],{"class":818}," hamilton",[808,1936,832],{"class":831},[808,1938,1939],{"class":976},"pipettes",[808,1941,832],{"class":831},[808,1943,1944],{"class":860},"pick_up_tips",[808,1946,910],{"class":831},[808,1948,1949],{"class":1008},"channels",[808,1951,1952],{"class":831},"=[",[808,1954,1955],{"class":1215},"0",[808,1957,1582],{"class":831},[808,1959,1960],{"class":1008}," spots",[808,1962,1952],{"class":831},[808,1964,1965],{"class":860},"spot",[808,1967,1545],{"class":831},[808,1969,1970,1972,1974],{"class":810,"line":925},[808,1971,1608],{"class":814},[808,1973,1068],{"class":1067},[808,1975,888],{"class":831},[808,1977,1978,1981,1983,1986,1988],{"class":810,"line":952},[808,1979,1980],{"class":818},"    spot",[808,1982,832],{"class":831},[808,1984,1985],{"class":860},"mark_errored",[808,1987,879],{"class":831},[808,1989,1990],{"class":1117},"   # contents are now Unknown\n",[808,1992,1993],{"class":810,"line":957},[808,1994,1709],{"class":814},[808,1996,1997],{"class":810,"line":965},[808,1998,847],{"emptyLinePlaceholder":846},[808,2000,2001,2003,2005,2008],{"class":810,"line":988},[808,2002,1965],{"class":818},[808,2004,832],{"class":831},[808,2006,2007],{"class":976},"errored",[808,2009,2010],{"class":1117},"             # True\n",[808,2012,2013,2016,2018,2020,2022,2025,2028,2031,2033],{"class":810,"line":1038},[808,2014,2015],{"class":860},"isinstance",[808,2017,910],{"class":831},[808,2019,1965],{"class":860},[808,2021,832],{"class":831},[808,2023,2024],{"class":860},"get",[808,2026,2027],{"class":831},"(),",[808,2029,2030],{"class":860}," Unknown",[808,2032,1677],{"class":831},[808,2034,2035],{"class":1117},"   # True\n",[756,2037,2038,2041,2042,2045,2046,2048],{},[790,2039,2040],{},"mark_errored()"," works whether the spot was occupied or empty; the previous occupant is detached. Clearing the spot with ",[790,2043,2044],{},"spot.remove()"," discards the ",[790,2047,1866],{}," placeholder and restores the empty, non-errored state. Marking spots as errored keeps the deck model honest so downstream steps — and anyone reloading the saved deck — know not to rely on those positions.",[782,2050,2052],{"id":2051},"logging-for-traceability","Logging for traceability",[756,2054,2055],{},"Set up logging once at the top of your script, before any instrument connections:",[799,2057,2059],{"className":801,"code":2058,"language":803,"meta":804,"style":804},"import logging\n\nlogging.basicConfig(\n    level=logging.INFO,\n    format=\"%(asctime)s %(levelname)s %(name)s — %(message)s\",\n    handlers=[\n        logging.StreamHandler(),\n        logging.FileHandler(\"run.log\"),\n    ],\n)\n",[790,2060,2061,2067,2071,2083,2100,2128,2136,2148,2169,2174],{"__ignoreMap":804},[808,2062,2063,2065],{"class":810,"line":811},[808,2064,815],{"class":814},[808,2066,819],{"class":818},[808,2068,2069],{"class":810,"line":822},[808,2070,847],{"emptyLinePlaceholder":846},[808,2072,2073,2076,2078,2081],{"class":810,"line":843},[808,2074,2075],{"class":818},"logging",[808,2077,832],{"class":831},[808,2079,2080],{"class":860},"basicConfig",[808,2082,1437],{"class":831},[808,2084,2085,2088,2090,2092,2094,2097],{"class":810,"line":850},[808,2086,2087],{"class":1008},"    level",[808,2089,897],{"class":831},[808,2091,2075],{"class":860},[808,2093,832],{"class":831},[808,2095,2096],{"class":976},"INFO",[808,2098,2099],{"class":831},",\n",[808,2101,2102,2105,2107,2109,2112,2115,2118,2121,2124,2126],{"class":810,"line":867},[808,2103,2104],{"class":1008},"    format",[808,2106,897],{"class":831},[808,2108,913],{"class":831},[808,2110,2111],{"class":1215},"%(asctime)s",[808,2113,2114],{"class":1215}," %(levelname)s",[808,2116,2117],{"class":1215}," %(name)s",[808,2119,2120],{"class":916}," — ",[808,2122,2123],{"class":1215},"%(message)s",[808,2125,913],{"class":831},[808,2127,2099],{"class":831},[808,2129,2130,2133],{"class":810,"line":891},[808,2131,2132],{"class":1008},"    handlers",[808,2134,2135],{"class":831},"=[\n",[808,2137,2138,2140,2142,2145],{"class":810,"line":925},[808,2139,1322],{"class":860},[808,2141,832],{"class":831},[808,2143,2144],{"class":860},"StreamHandler",[808,2146,2147],{"class":831},"(),\n",[808,2149,2150,2152,2154,2157,2159,2161,2164,2166],{"class":810,"line":952},[808,2151,1322],{"class":860},[808,2153,832],{"class":831},[808,2155,2156],{"class":860},"FileHandler",[808,2158,910],{"class":831},[808,2160,913],{"class":831},[808,2162,2163],{"class":916},"run.log",[808,2165,913],{"class":831},[808,2167,2168],{"class":831},"),\n",[808,2170,2171],{"class":810,"line":957},[808,2172,2173],{"class":831},"    ],\n",[808,2175,2176],{"class":810,"line":965},[808,2177,922],{"class":831},[756,2179,2180],{},"Log before and after every state-changing operation, not for debugging, but for audit and post-run analysis:",[799,2182,2184],{"className":801,"code":2183,"language":803,"meta":804,"style":804},"logging.info(\"Opening incubator door\")\nawait incubator.door.open()\nlogging.info(\"Incubator door open\")\n\nlogging.info(\"Moving plate: %s → %s\", source_well, dest_well)\nawait gripper.arm.move_plate(source=source_well, destination=dest_well)\nlogging.info(\"Plate move complete\")\n",[790,2185,2186,2206,2224,2243,2247,2283,2318],{"__ignoreMap":804},[808,2187,2188,2190,2192,2195,2197,2199,2202,2204],{"class":810,"line":811},[808,2189,2075],{"class":818},[808,2191,832],{"class":831},[808,2193,2194],{"class":860},"info",[808,2196,910],{"class":831},[808,2198,913],{"class":831},[808,2200,2201],{"class":916},"Opening incubator door",[808,2203,913],{"class":831},[808,2205,922],{"class":831},[808,2207,2208,2211,2213,2215,2218,2220,2222],{"class":810,"line":822},[808,2209,2210],{"class":814},"await",[808,2212,971],{"class":818},[808,2214,832],{"class":831},[808,2216,2217],{"class":976},"door",[808,2219,832],{"class":831},[808,2221,982],{"class":860},[808,2223,985],{"class":831},[808,2225,2226,2228,2230,2232,2234,2236,2239,2241],{"class":810,"line":843},[808,2227,2075],{"class":818},[808,2229,832],{"class":831},[808,2231,2194],{"class":860},[808,2233,910],{"class":831},[808,2235,913],{"class":831},[808,2237,2238],{"class":916},"Incubator door open",[808,2240,913],{"class":831},[808,2242,922],{"class":831},[808,2244,2245],{"class":810,"line":850},[808,2246,847],{"emptyLinePlaceholder":846},[808,2248,2249,2251,2253,2255,2257,2259,2262,2264,2267,2269,2271,2273,2276,2278,2281],{"class":810,"line":867},[808,2250,2075],{"class":818},[808,2252,832],{"class":831},[808,2254,2194],{"class":860},[808,2256,910],{"class":831},[808,2258,913],{"class":831},[808,2260,2261],{"class":916},"Moving plate: ",[808,2263,1791],{"class":1215},[808,2265,2266],{"class":916}," → ",[808,2268,1791],{"class":1215},[808,2270,913],{"class":831},[808,2272,1021],{"class":831},[808,2274,2275],{"class":860}," source_well",[808,2277,1021],{"class":831},[808,2279,2280],{"class":860}," dest_well",[808,2282,922],{"class":831},[808,2284,2285,2287,2289,2291,2294,2296,2298,2300,2302,2304,2307,2309,2311,2313,2316],{"class":810,"line":891},[808,2286,2210],{"class":814},[808,2288,993],{"class":818},[808,2290,832],{"class":831},[808,2292,2293],{"class":976},"arm",[808,2295,832],{"class":831},[808,2297,1003],{"class":860},[808,2299,910],{"class":831},[808,2301,1009],{"class":1008},[808,2303,897],{"class":831},[808,2305,2306],{"class":860},"source_well",[808,2308,1021],{"class":831},[808,2310,1024],{"class":1008},[808,2312,897],{"class":831},[808,2314,2315],{"class":860},"dest_well",[808,2317,922],{"class":831},[808,2319,2320,2322,2324,2326,2328,2330,2333,2335],{"class":810,"line":925},[808,2321,2075],{"class":818},[808,2323,832],{"class":831},[808,2325,2194],{"class":860},[808,2327,910],{"class":831},[808,2329,913],{"class":831},[808,2331,2332],{"class":916},"Plate move complete",[808,2334,913],{"class":831},[808,2336,922],{"class":831},[756,2338,2339,2340,2342],{},"The ",[790,2341,2163],{}," file gives you a timestamped record of every physical action your script took. Many logs are automatically written and stored on the platform (API logs), others are available but not surfaced unless logging is explicitly set up (inbuilt SDK logs).",[782,2344,2346],{"id":2345},"safe-state-checklist","Safe-state checklist",[756,2348,2349],{},"Before finishing an error handler, check:",[2351,2352,2353,2360,2366,2372,2378,2384],"ol",{},[2354,2355,2356,2359],"li",{},[760,2357,2358],{},"Connections",": are open connections closed or returned to their pool?",[2354,2361,2362,2365],{},[760,2363,2364],{},"Held labware",": is the gripper parked? Is a pipette tip ejected?",[2354,2367,2368,2371],{},[760,2369,2370],{},"Instrument doors",": are incubator and centrifuge doors closed?",[2354,2373,2374,2377],{},[760,2375,2376],{},"Partial results",": have you written whatever data you collected so far?",[2354,2379,2380,2383],{},[760,2381,2382],{},"Notification",": if the method was running unattended, does someone know it failed?",[2354,2385,2386,2391,2392,2394],{},[760,2387,2388,2390],{},[790,2389,796],{}," safety",": does your ",[790,2393,796],{}," block avoid raising its own exception?",[782,2396,2398],{"id":2397},"next-steps","Next steps",[2400,2401,2402,2408,2414],"ul",{},[2354,2403,2404,2407],{},[776,2405,135],{"href":2406},"\u002Foperate\u002Foverview\u002F",": define deck positions your error handlers can reference",[2354,2409,2410,2413],{},[776,2411,238],{"href":2412},"\u002Foperate\u002Fguides\u002Fpipetting\u002Fbasic-pipetting\u002F",": tip ejection and liquid-handling-specific error patterns",[2354,2415,2416,2419],{},[776,2417,2418],{"href":778},"Automate → Error handling",": declare retry policy and checkpoint-based resumption instead of writing it yourself",[2421,2422,2423],"style",{},"html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":804,"searchDepth":811,"depth":822,"links":2425},[2426,2427,2433,2434,2435,2436],{"id":784,"depth":822,"text":785},{"id":1182,"depth":822,"text":1183,"children":2428},[2429,2430,2431,2432],{"id":1187,"depth":843,"text":1188},{"id":1376,"depth":843,"text":1377},{"id":1463,"depth":843,"text":1464},{"id":1715,"depth":843,"text":1716},{"id":1847,"depth":822,"text":1848},{"id":2051,"depth":822,"text":2052},{"id":2345,"depth":822,"text":2346},{"id":2397,"depth":822,"text":2398},"Handle device failures, timeouts, and unexpected states safely in your lab automation scripts.","md",null,{},{"title":183,"description":2437},"mhUdBn5TnLwQngmmGY0J2sNQ2nxExpd4gdKLT-O9psw",[2444,2446],{"title":179,"path":180,"stem":181,"description":2445},"What the mock actually models — the validations it catches, the ones it doesn't, and why a protocol can pass the mock and still fail on hardware.",{"title":163,"path":192,"stem":193,"description":2447},"Use Standard Labware and define custom plates, tips, tubes, troughs, carriers, and adapters using the labware base classes.",1783607765018]